跟进:Django中具有联接的组元素计数

时间:2014-08-01 13:17:49

标签: sql django join orm annotate

为了在此处构建this question,我们遇到了关于Django ORM中聚合注释的另一个问题。

因为我们在查询中需要连接,所以会导致这种笨拙的“额外”声明:

Entry.objects.all()
             .extra(select={'week_year': "TO_CHAR(entry_addition.date, 'IW/YYYY')"}, where=["addition_id=entry_addition.id"], tables=['entry_addition'])
             .values('week_year')
             .annotate(Count('addition'))

我们创建了以下两个类来摆脱“额外”语句。

class ToChar(Aggregate):
    name = 'ToChar_pg'

    WEEK_YEAR = 'IW/YYYY'

    def __init__(self, lookup, format_, **extra):
        extra['format_'] = format_
        super(ToChar, self).__init__(lookup, **extra)
django.db.models.ToChar = ToChar


class ToChar_pg(django.db.models.sql.aggregates.Aggregate):

    sql_function = 'TO_CHAR'
    sql_template = """%(function)s(%(field)s, '%(format)s')"""

    def __init__(self, col, format_=None, source=None, distinct=False, **extra):
        extra['format'] = format_
        super(ToChar_pg, self).__init__(col, source=source, distinct=distinct, **extra)
django.db.models.ToChar_pg = ToChar_pg

现在,我们得到了这个ORM表达式:

Entry.objects.all()
             .annotate(week_year=ToChar('addition__date', ToChar.WEEK_YEAR))
             .values('week_year')
             .annotate(count=Count('addition'))

这是所需的SQL语句:

SELECT TO_CHAR("entry_addition"."date", 'IW/YYYY') AS "week_year", COUNT("entry"."addition_id") AS "count"
FROM "entry" LEFT OUTER JOIN "entry_addition" ON ("entry"."addition_id" = "entry_addition"."id")
GROUP BY week_year

这是实际输出:

SELECT TO_CHAR("entry_addition"."date", 'IW/YYYY') AS "week_year", COUNT("entry"."addition_id") AS "count"
FROM "entry" LEFT OUTER JOIN "entry_addition" ON ("entry"."addition_id" = "entry_addition"."id")

现在,出现以下问题:“GROUP BY”子句在哪里?

0 个答案:

没有答案