Django 按日期返回对象注释组



我正在使用聚合文档中的 Django annotate

我的目标是按日期对模型进行分组,并以以下形式返回与每个日期关联的所有对象:

[{
  'date': datetime.datetime(2019, 6, 22, 11, 35), 
  'instances': [<Model: (1)>, <Model: (2)>  ]
},
{
  'date': datetime.datetime(2019, 6, 21, 11, 35),
  'instances': [<Model: (3)>, <Model: (6)>  ]
},]

我尝试了这个查询:

Flight.objects.values('origin_scheduled_dep').annotate(Count('origin_scheduled_dep')).order_by('origin_scheduled_dep')

但这返回了我指定的values

<QuerySet [{'origin_scheduled_dep': datetime.datetime(2019, 6, 22, 11, 35), 'origin_scheduled_dep__count': 1}, {'origin_scheduled_dep': datetime.datetime(2019, 6, 22, 15, 40), 'origin_scheduled_dep__count': 1}, {'origin_scheduled_dep': datetime.datetime(2019, 6, 22, 22, 0), 'origin_scheduled_dep__count': 2}]>

感谢您的任何帮助,始终:)

您可以使用

TruncDate这样做:

from django.db.models.functions import TruncDate
Flight.objects.annotate(date=TruncDate('origin_scheduled_dep')).values('date').annotate(count=Count('date')).order_by('date')

仅供参考:如果您使用的是MySQL并使用django的时区支持,请使用mysql_tzinfo_to_sql将时区表加载到MySQL数据库(reference(。这个SO answer可能会有所帮助。


更新

我不认为仅使用 django 查询集函数可以实现您的预期结果。所以,我认为你需要使用一些python函数来实现它,像这样:

from collections import defaultdict  
results = defaultdict(list)
queryset = Flight.objects.annotate(date=TruncDate('origin_scheduled_dep')).order_by('date')
for flight in queryset:
    results[flight.date].append(flight)
for key, value in results.items():
     print(key,value)

或者,您可以使用regroup模板标记来显示分层列表。

您需要

混合使用TruncDateorder_byitertools.groupby

from itertools import groupby
from operator import attrgetter
queryset = Flight.objects.annotate(
   date=TruncDate('origin_scheduled_dep'),
).order_by('date')
grouped = [
    {'date': date, 'instances': instances}
    for date, instances in itertools.groupby(
       queryset.iterator(), attrgetter('date')
    )
]

我认为它会根据需要工作,但我认为这不是解决问题的最佳实践

from django.db.models import Count
times = Flight.objects.values_list('origin_scheduled_dep', flat=True).annotate(Count('origin_scheduled_dep'))
my_list = []
for time in times:
    my_list.append({'date': time, 'instances': Flight.objects.filter(origin_scheduled_dep=time)})

我试图用Django ORM做到这一点,但我不能所以我对具有 820 个重复值的 330000 数据集进行了测试,有些值具有超过 2200 个实例,时间很好

最新更新