我使用以下查询来获取每日总和:
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期间生成总和 。我认为使用datetime__range = ..
会有所作为,但我在django查询中没有经验。
...谢谢
答案 0 :(得分:0)
这似乎可以完成这项工作:
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
,否则(我不知道为什么!)。