每天时间范围内的Django注释

时间:2017-09-01 09:00:34

标签: python django django-annotate

我使用以下查询来获取每日总和:

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查询中没有经验。

...谢谢

1 个答案:

答案 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

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