基于ForeignKey子元素之间的关系查询Django模型

时间:2012-03-18 10:59:34

标签: python django django-queryset

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。

2 个答案:

答案 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:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

答案 1 :(得分:0)

您可以使用以下语法执行跨越关系的查询:

Product.objects.filter(price_history__price = 3)

但是,我不确定是否可以在纯django查询中有效地执行您想要的查询。