【问题标题】:Django annotation per day time range每天时间范围内的 Django 注释
【发布时间】:2017-09-01 09:00:33
【问题描述】:

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

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

谢谢...

【问题讨论】:

    标签: python django django-annotate


    【解决方案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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2017-11-18
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多