我正在使用聚合文档中的 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
模板标记来显示分层列表。
混合使用TruncDate
、order_by
和itertools.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 个实例,时间很好