我试图构造以下类似于Django ORM的查询:SELECT * FROM table WHERE depth = (SELECT MIN(depth) FROM table)
如何用Django ORM表示法来写呢?到目前为止,似乎很难使用这样的聚合,因为QuerySet.aggregate()
不是惰性计算,而是直接执行。
我知道这个基本的例子可以写成Model.objects.filter(depth=Model.objects.aggregate(m=Min('depth'))['m'])
,但是它不能进行惰性计算,需要两个独立的查询。对于我更复杂的情况,我肯定需要一个惰性计算的查询集。
仅供参考,我尝试过但失败了:
- 一个带有
Model.objects.order_by().values().annotate(m=Min('depth').values('m'))
的子查询将导致一个似乎很难释放的GROUP BY id
。 - 带有
Model.objects.annotate(m=Min('depth')).filter(depth=F('m'))
的子查询将给予一个GROUP BY id
,并将m
值包含在主结果中,这就是annotate所做的。
我目前的解决方法是使用QuerySet.extra(where=[...])
,但我更希望看到ORM生成该代码。
1条答案
按热度按时间vc6uscn91#
这个应该能用
使用annotate而不是aggregate将使查询集保持惰性。