Django 注解每天时间范围

Django annotation per day time range

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

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

谢谢...

这似乎可以解决问题:

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是必不可少的,因为我得到了

Expression contains mixed types. You must set output_field

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