我有以下型号:
class Event(models.Model):
date = models.DateTimeField()
event_type = models.ForeignKey('EventType')
class EventType(models.Model):
name = models.CharField(unique=True)
我正在尝试获取所有日期的列表,以及该日期可用的事件类型。
列表中的每个项目都是一个包含两个字段的字典:date
和 event_types
,这将是该日期可用的不同事件类型的列表。
目前,我提出了一个查询来获取所有不同日期的列表,但这只是我想要做的一半:
query = Event.objects.all().select_related('event_type')
results = query.distinct('date').order_by('date').values_list('date', flat=True)
现在我可以稍微更改一下,以获得所有不同日期 + event_type 组合的列表:
query = Event.objects.all().select_related('event_type')
results = query.order_by('date').distinct('date', 'event_type').values_list('date', 'event_type__name')
但这将为给定日期内的每种事件类型提供一个条目。我需要在每个日期内汇总一个列表。
有没有办法构建一个查询集来做到这一点?如果没有,我该如何以其他方式达到相同的结果?
最佳答案
您可以使用itertools
的groupby
函数执行此类聚合。就“石斑鱼标准”而言,要求元素以“ block ”形式出现。但这里就是这种情况,因为您使用了 order_by
。
我们可以这样写:
<b>from itertools import groupby
from operator import itemgetter</b>
query = (Event.objects.all.select_related('event_type')
.order_by('date'<b>, 'event_type'</b>)
.distinct('date', 'event_type')
.values_list('date', 'event_type__name'))
result = [
{ 'date': k, 'datetypes': [v[1] for v in vs]}
for k, vs in <b>groupby(query, itemgetter(0))</b>
]
您还最好在按条件排序时使用'event_type'
。
这将导致类似的结果:
[{'date': datetime.date(2018, 5, 19), 'datetypes': ['Famous person died',
'Royal wedding']},
{'date': datetime.date(2018, 5, 24), 'datetypes': ['Famous person died']},
{'date': datetime.date(2011, 5, 25), 'datetypes': ['Important law enforced',
'Referendum']}]
(基于维基百科对五月最后几天的快速扫描)。
groupby
在线性时间内与返回的行数一起工作。
关于python - Django orm - 如何在不同日期的查询中获取不同的字段项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50729034/