【问题标题】:Django annotate queryset with counting its members by conditionDjango通过条件计算其成员来注释查询集
【发布时间】:2020-10-29 05:08:46
【问题描述】:

我有一个模型:

class Event(models.Model):
    start_date = DateTimeField()
    end_date = DateTimeField()

我想统计同一天的所有事件,并将此计数作为注释字段daily_events 包含在查询集的每个成员中。我想在数据库方面解决这个问题以提高速度。到目前为止我的代码:

from django.db.models import F, Q, DateTimeField, Count
from django.db.models.functions import TruncDate

events = Event.objects.all()
events = events.annotate(
    daily_events=Count('pk', filter=Q(start_date__date=TruncDate(F('start_date')))))
for event in events:
    print(event.daily_events)

例如我有 4 个事件,前 3 个在同一天,所以期望的输出应该是:

3
3
3
1

但当前输出错误:

1
1
1
1

有什么建议吗?

【问题讨论】:

    标签: python django django-models django-orm django-annotate


    【解决方案1】:

    不幸的是,使用您的方法,只能生成聚合的.values(),类似于{start_date: '2020-10-10', daily_events: 3}。如果你真的需要带注释的模型对象,它会更复杂。可以使用相关子查询来实现所需的结果。

    events = Event.objects.annotate(start_date_date=TruncDate('start_date'))
    events_counts = events.values('start_date_date').annotate(daily_events=Count('*'))
    
    subquery = events_counts.filter(start_date_date=OuterRef('start_date_date'))
    events = events.annotate(daily_events=Subquery(subquery.values('daily_events'))
    

    编辑:添加了TruncDate 部分

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多