Mysql Django对子查询中的行进行计数

Mysql Django对子查询中的行进行计数,mysql,django,django-orm,Mysql,Django,Django Orm,我需要计算子查询中的行数,下面是我的sqlite解决方案 class SQCount(Subquery): """Count lines in subquery""" template = "(SELECT count(*) FROM (%(subquery)s) _count)" output_field = models.IntegerField() sub = MyModel.obj

我需要计算子查询中的行数,下面是我的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\u by()
    将取消订购(如果有)
  • 第一个值
    。值('parent')
    将引入正确的分组
  • .annotate(count=count('pk'))
    将对我们要寻找的答案进行注释(每行都有注释)
  • 第二个值
    。值('count')
    将行限制为
    计数
  • 合并
    将首先返回非空值或零

从Django做这件事很棘手,但效率很高。

为什么
用户
不是
外键
我的模型
?这将使它在Django中更加优雅,并且(可能)在数据库端更加高效。
user
MyModel
的外键。但是我想在这里使用子查询,因为实际上我的请求必须使用子查询(有疑问的是,您可以看到简化的代码)。django sql utils库删除了大量的锅炉板,因此它不是那么复杂的Parent.objects.annotate(child_count=SubqueryCount('child'))