如果我有这样的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>],
...
}
构建此查询的最佳方法是什么?
答案 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'
)
但我认为其他解决方案最终会更容易。