python - 根据ForeignKey子元素之间的关系查询Django模型

标签 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 的价格高于任何较早日期的产品。

谢谢各位研究人员。

最佳答案

正如 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:

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

关于python - 根据ForeignKey子元素之间的关系查询Django模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9757748/

相关文章:

python - 使用 Python 从包含给定字符串的 FTP 服务器下载文件

django-http-proxy 前置斜线

python - django.db.migrations.exceptions.InconsistentMigrationHistory

django - 在 Django Admin 中使用 raw_id_fields 时如何优化查询数量

django - 如何在 Django QuerySet 中按查询进行分组?

python - 超出递归深度、pickle 和 BeautifulSoup

python - 检测pandas数据帧列中的时间差是否为负

python - 如何从 VLC 捕获异常?

django order_by 任一列(日期以最近者为准)

python - 使用for循环打印值django模板