class Price(models.Model):
date = models.DateField()
price = models.DecimalField(max_digits=6, decimal_places=2)
product = models.ForeignKey("Product")
class Product(models.Model):
name = models.CharField(max_length=256)
price_history = models.ManyToManyField(Price, related_name="product_price", blank=True)
我想查询产品,以便我只返回日期x的价格高于任何早期日期的产品。
谢谢boffins。
答案 0 :(得分:1)
正如Marcin在另一个答案中所说,您可以使用双下划线语法深入查看关系。但是,您也可以链接它们,有时这可以更容易理解,即使它会导致更多的代码行。在你的情况下,我可能会做一些看起来像这样的事情:
首先你要知道日期价格x:
a = Product.objects.filter(price_history__date = somedate_x)
你应该测试每个日期是否有多个:
if a.count() == 1:
pass
else:
do something else here
(或类似的东西)
现在你有了自己的价格而且知道了约会日期,所以就这样做:
b = Product.objects.filter(price_history__date__lt = somedate, price_history__price__gt=a[0].price)
知道切片会自行命中数据库并返回一个对象。因此,此查询将在每次函数调用时三次访问数据库,一次用于计数,一次用于切片,一次用于实际查询。您可以通过执行聚合函数(比如一天中所有返回行的平均值)来放弃计数和切片,但这些行为本身就会变得昂贵。
有关更多信息,请参阅queryset api:
答案 1 :(得分:0)
您可以使用以下语法执行跨越关系的查询:
Product.objects.filter(price_history__price = 3)
但是,我不确定是否可以在纯django查询中有效地执行您想要的查询。