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 的价格高于任何较早日期的产品。
谢谢各位研究人员。
最佳答案
正如 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)
知道切片将自行访问数据库并返回一个对象。因此,每个函数调用此查询将访问数据库三次,一次用于计数,一次用于切片,一次用于实际查询。您可以通过执行聚合函数(例如一天中所有返回行的平均值)来放弃计数和切片,但这些函数本身可能会变得昂贵。
有关更多信息,请参阅查询集 API:
关于python - 根据ForeignKey子元素之间的关系查询Django模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9757748/