【发布时间】:2020-01-09 09:26:49
【问题描述】:
我正在使用 Django,我需要通过自定义函数对模型进行分组。
好的,我想要的查询是:
SELECT date_trunc('week',"model_table"."date") AS "date" FROM "model_table" GROUP BY "date"
然后我尝试的是以下内容:
class DateTrunc(Aggregate):
function = 'date_trunc'
template = "%(function)s('%(date_type)s',%(expressions)s)"
date_types = ['microsecond', 'millisecond', 'second', 'minute', 'hour', 'day', 'week', 'month', 'quarter', 'year', 'decade', 'century', 'millenium']
def __init__(self, date_type, expression, group_by=False, **extra):
self.must_group_by = group_by # Name "group_by" is already used.
if date_type not in self.date_types:
raise AttributeError('The specified "date_type" is not correct.')
super().__init__(expression, date_type=date_type, **extra)
def get_group_by_cols(self):
if self.must_group_by:
return [self]
return super().get_group_by_cols()
In [1]: Model.objects.annotate(date=DateTrunc('week','date',True)).values('date').query.__str__()
Out[1]: 'SELECT date_trunc(\'week\',"model_table"."date") AS "date" FROM "model_table" GROUP BY "model_table"."id", date_trunc(\'week\',"model_table"."date")'
除了GROUP BY 子句还插入表唯一ID 之外,其他方法都可以找到。这意味着最终结果根本没有分组。
我一直在检查 Django 代码,在 Query 类中有一个函数 set_group_by 把它弄得一团糟,但我真的不知道如何破解它。
无论如何,我认为正确的方法是继承 Func 类而不是 Aggregate,但是我无法让 Djangot 在最终 SQL 中插入 GROUP BY 子句。
知道如何在不使用cursor、RawSQL 或其他直接编写查询的方式对查询进行硬编码的情况下解决这个问题吗?
【问题讨论】:
标签: python django postgresql orm