1

我正在使用以下查询来获取每天的总和:

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 期间生成总和。我认为使用会做,但我在 django 查询方面没有经验。datetime__range = ..

谢谢...

4

1 回答 1

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

,否则(我不知道为什么!)。

于 2017-09-01T14:26:23.050 回答