也可以创建的子类Subquery
,以更改其输出的sql。例如,你可以使用:
class SQCount(Subquery):
template = "(SELECT count(*) FROM (%(subquery)s) _count)"
output_field = models.IntegerField()
然后,你将像使用原始Subquery类一样使用它:
spaces = Space.objects.filter(carpark=OuterRef('pk')).values('pk')
Carpark.objects.annotate(space_count=SQCount(spaces))
你可以将此技巧(至少在postgres中)与一系列聚合函数结合使用:我经常使用它来构建值数组或求和。
我只需要从模型中删除规定的元顺序。你可以通过.order_by(
)在子查询中添加一个空白来实现。在我的代码中,这意味着:
spaces = Space.objects.filter(carpark=OuterRef('pk')).order_by().values('carpark')
count_spaces = spaces.annotate(c=Count('*')).values('c')
Carpark.objects.annotate(space_count=Subquery(count_spaces))