【问题标题】:Django Count lines in a Subquery子查询中的 Django 计数行
【发布时间】:2021-04-12 11:14:05
【问题描述】:

我需要计算子查询中的行数,这是我的 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' 子句中的未知列)。任何帮助表示赞赏。

【问题讨论】:

  • 为什么user 不是ForeignKeyMyModel?这将使它在 Django 中更优雅,并且(可能)在数据库端更高效。
  • userMyModel 的外键。但我想在这里使用子查询,因为实际上我的请求必须使用子查询(有问题你可以看到简化代码)

标签: mysql django django-orm


【解决方案1】:

这是在 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 将首先返回非空值或零

这在 Django 中很棘手,但非常有效。

【讨论】:

  • django-sql-utils 库删除了很多样板,因此它不是那么棘手 Parent.objects.annotate(child_count=SubqueryCount('child'))
猜你喜欢
  • 2018-02-19
  • 1970-01-01
  • 2011-07-18
  • 2012-10-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多