【发布时间】:2017-05-22 02:09:08
【问题描述】:
我正在尝试编写一个依赖于两个 ForeignKeys 的查询。
有一个Product可以有很多Occurence对象(ForeignKey)。 Occurence 对象可以有许多 Scan 对象(ForeignKey 也是)。
现在我想根据它的 datetime 属性获取每次出现的对象最后一次扫描,如果它的属性 price 不是 Null(Price 是 OneToOneField)。
天真的方法:
product = Product.objects.first()
scans = []
for occ in product.occurences.all():
scan = occ.scans.filter(price__isnull=False).orderby("-datetime").first()
if scan:
scans.append(scan)
>>> result is scans list
这种方法有很多缺点。一种产品可能有数百次出现和数百万次扫描,因此最好是数据库来完成这项工作。
所以我正在寻找可以做到这一点的查询。
Scan.objects.filter(occurence__product=product,price__isnull=False)
这将返回价格属性不为空的产品的所有扫描。我想我应该使用GroupBy,但我不知道如何使用。
【问题讨论】:
-
为什么需要
GROUP BY?您没有任何注释,并且您正在从Scan中选择所有列,所以我看不出它会有什么影响。当你确实需要GROUP BY时,Django 会自动将它添加到查询中。 -
我认为我应该按出现次数对扫描进行分组,然后从每个组中获取最新的扫描。也许我不需要 GROUP BY。你知道如何解决这个问题吗?
标签: sql django django-models orm django-filter