Django查询在字段上分组的对象

时间:2015-06-02 00:58:32

标签: python django database django-models

如果我有这样的django模型:

class Person(models.Model):
    given_names = models.CharField(max_length=144)
    surname = models.CharField(max_length=144)

我想构建一个查询,它将返回数据库中的所有人,按姓氏分组。它应该返回这样的东西:

{
    'Smith': [<Person: Joseph A Smith>, <Person: Joseph B Smith>],
    'Bloggs': [<Person: Joseph A Bloggs>, <Person: Joseph B Bloggs>],
    ...
}

构建此查询的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

from collections import defaultdict

result = defaultdict(list)
persons = Person.objects.all()
for person in persons:
    result[person.surname].append(person)

问题是像“SMith”,“SMITH”或“Smith”这样的姓氏。在这种情况下,将result[person.surname]...替换为result[person.surname.strip().lower()]...会有所帮助。

答案 1 :(得分:0)

完全按照你要求的方法做的一种方法是为每个姓氏创建一个查询集,循环遍历姓氏,然后将它们添加到dict中,如下所示:

for name in Person.objects.values('surname').distinct():
    qs = Person.objects.filter(surname__icontains=name)
    your_dict[name] = qs

并将其添加到字典中。

您也可以考虑使用外键将姓氏作为自己的模型Person。你可以循环遍历所有的姓氏:

for s in Surname.objects.all():
    people = Person.objects.filter(surname=s.name)
    your_dict[s.name] = people

最后,如果你正在使用MySQL(你需要为Postgres提供不同的东西),你可以放弃原始SQL,尝试类似下面的内容:

people = Person.objects.raw(
    'SELECT surname, GROUP_CONCAT(given_names) FROM personapp_person GROUP BY surname'
)

但我认为其他解决方案最终会更容易。