子查询中的 Django 计数行

Django Count lines in a Subquery

我需要计算子查询中的行数,这是我的 sqlite 解决方案。

class SQCount(Subquery):
    """Count lines in subquery"""
    template = "(SELECT count(*) FROM (%(subquery)s) _count)"
    output_field = models.IntegerField() 

sub = MyModel.objects.filter(user=OuterRef(OuterRef('id'))).values('id')
qs = qs.annotate(count_total=SQCount(sub))

它适用于 sqlite 但不适用于 MySQL(抱怨 'where' 子句中的未知列)。任何帮助表示赞赏。

这是在 Django 子查询中计算行数的正确方法

subquery = Subquery(Child.objects.filter(parent_id=OuterRef('id')).order_by()
                    .values('parent').annotate(count=Count('pk'))
                    .values('count'), output_field=IntegerField())
Parent.objects.annotate(child_count=Coalesce(subquery, 0))
  • .order_by()将取消订单
  • 第一个值 .values('parent') 将引入右分组
  • .annotate(count=Count('pk')) 将注释(每行广告)我们正在寻找的答案
  • 第二个值 .values('count') 将行限制为 count 独占
  • Coalesce 将 return 首先不是空值或零

从 Django 做到这一点很棘手,但效率很高。