Django 如何对转换后的值进行分组?

Django 如何对转换后的值进行分组?,django,Django,到目前为止,我有一个疑问: q = Foobar.objects.values('updater','updated') q = q.annotate(update_count=Count("id")) 这似乎会生成如下查询: select updater, updated, count(id) from foobar group by updater, updated “updated”是一个日期时间字段,我希望通过如下查询按天进行计数: select updater, cast(upda

到目前为止,我有一个疑问:

q = Foobar.objects.values('updater','updated')
q = q.annotate(update_count=Count("id"))
这似乎会生成如下查询:

select updater, updated, count(id)
from foobar
group by updater, updated
“updated”是一个日期时间字段,我希望通过如下查询按天进行计数:

select updater, cast(updated as date), count(id)
from foobar
group by updater, cast(updated as date)
查询API有没有办法做到这一点,或者我必须回到原始SQL吗?

QuerySet.dates()()可以让您参与其中,但它似乎不能很好地处理
.values()
,并通过
创建一个
分组(我尝试了几分钟)。也许你已经看到了

但它确实表明Django已经有了一个SQL函数,如果您编写自己的SQL版本,则需要该函数:

print(ProcessingState.objects.dates('timestamp', 'day').query)
屈服

SELECT DISTINCT django_date_trunc("day", "databot_processingstate"."timestamp")
    FROM "databot_processingstate" ORDER BY 1 ASC

(为奇怪的表名和东西感到抱歉,这只是我自己的模型,我碰巧手头有)

Django不支持对数据库查询进行这种级别的控制-通常,您不能让查询使用CAST之类的函数

不过,在这种情况下,您有一些选择。首先,最简单的是,您可以使用
datetime.replace()
获取ORM对象返回的datetime对象,并删除额外的精度

另一种选择是,如果您知道您永远不希望Django应用程序在一天之后在更新字段中使用任何精度,只需在models.py中将
updated
定义为
models.DateField()
,而不是
models.DateTimeField()
。这意味着ORM模型返回的数据将永远不会超过一天

最后,我假设您使用的是最新的Django(1.1),但在Django 1.2(定于5月10日)中,您将能够执行以下操作:

Foobar.objects.raw(“选择更新程序,强制转换(更新为日期),按更新程序从Foobar组中计数(id),强制转换(更新为日期)”)

结果(假设它的列数和列类型与您在Foobar模型中定义的列数和列类型相同)将是一个普通的django ORM查询集