Mysql Django对子查询中的行进行计数
我需要计算子查询中的行数,下面是我的sqlite解决方案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
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'))