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

时间:2010-05-05 14:31:13

标签: 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(updated as date), count(id)
from foobar
group by updater, cast(updated as date)

有没有办法使用Query API执行此操作,还是必须回退到原始SQL?

2 个答案:

答案 0 :(得分:0)

QuerySet.dates()(http://docs.djangoproject.com/en/dev/ref/models/querysets/#dates-field-kind-order-asc)带你参与其中的一部分,但它似乎与.values()不一致并且制作GROUP BY(我试过几分钟)。也许你已经看过了......无论如何......

但它确实表明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

(对不起奇怪的表名和东西,这只是我自己的模型,我发现它很方便)

答案 1 :(得分:0)

Django不支持对数据库查询的这种级别的控制 - 通常,你不能使查询使用像CAST这样的函数。

但在这种情况下你有几个选择。首先,最简单的说,您可以使用ORM对象返回的datetime对象,并使用datetime.replace()删除额外的精度。

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

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

models.DateTimeField()

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