到目前为止,我有这个问题:
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?
答案 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。