为了在此处构建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”子句在哪里?