【问题标题】:Django annotation per day time range每天时间范围内的 Django 注释
【发布时间】:2017-09-01 09:00:33
【问题描述】:
我正在使用以下查询来获取每天的总和:
orders = OrderM.objects.filter(user=request.user) \
.annotate(day=TruncDay('datetime_added')) \
.values('day') \
.annotate(sum=Sum(F('orderd__good_count'))) \
.order_by('-day')
正如预期的那样,每天午夜 00:00 都会发生变化!我想更改此行为,以便在每个 天 的 06:00 到 06:00 期间生成 sum。我认为使用datetime__range = .. 就可以了,但我对django 查询没有经验。
谢谢...
【问题讨论】:
标签:
python
django
django-annotate
【解决方案1】:
这似乎起作用了:
from django.db.models import DateTimeField, ExpressionWrapper, F
from django.utils.timezone import timedelta
expression = F('datetime_added') - timedelta(hours=6)
wrapped_expression = ExpressionWrapper(expression, output_field=DateTimeField())
orders = OrderM.objects.filter(user=request.user) \
.annotate(day=TruncDay(wrapped_expression)) \
.values('day') \
.annotate(sum=Sum(F('orderd__good_count'))) \
.order_by('-day')
TruncDay('datetime_added') 的时间部分定义为午夜 00:00。
所以我们必须在截断之前从每个datetime 字段中减去 6 小时。以下内容实际上会更改早上 6 点之后的一天部分!
`TruncDay( F('datetime_added') - timedelta(hours=6) )`
ExpressionWrapper 的使用是必不可少的,因为我明白了
表达式包含混合类型。你必须设置 output_field
,否则(我不知道为什么!)。