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
,否则(我不知道为什么!)。
我正在使用以下查询来获取每天的总和:
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
,否则(我不知道为什么!)。