python - Django orm - 如何在不同日期的查询中获取不同的字段项

标签 python django postgresql django-queryset

我有以下型号:

class Event(models.Model):
    date = models.DateTimeField()
    event_type = models.ForeignKey('EventType')

class EventType(models.Model):
    name = models.CharField(unique=True)

我正在尝试获取所有日期的列表,以及该日期可用的事件类型。

列表中的每个项目都是一个包含两个字段的字典:dateevent_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')

但这将为给定日期内的每种事件类型提供一个条目。我需要在每个日期内汇总一个列表。

有没有办法构建一个查询集来做到这一点?如果没有,我该如何以其他方式达到相同的结果?

最佳答案

您可以使用itertoolsgroupby函数执行此类聚合。就“石斑鱼标准”而言,要求元素以“ 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/

相关文章:

mysql - SQL 数据库中数据修订控制的最佳实践

sql - 文本数组中的 Postgres 检查约束值的有效性

postgresql - 类型整数 : "(2,2)" with composite data type while executing function 的输入语法无效

python - 如何在应用程序中配置所有记录器

python - 在python中提取xml标签之间的文本

python - 关系 "name"的列 "contact_contact"中的 null 值违反非空约束

javascript - Django 和 Ajax - 提交表单集

python - 如何查看 python namedlist 对象的属性?

python - 数据库游标

python - Django 中的中断迁移