Split queryset or get multiple querysets by field instead of just ordering by field

孤街醉人 提交于 2019-12-05 09:14:26

you can get all the unique lastnames:

from django.db.models import Count
...
last_names = Person.objects.values('last_name').annotate(Count('last_name')) # This will return all the unique last_names
values = dict( ((last_name['last_name'], Person.objects.all().filter(last_name = last_name['last_name'])) for last_name in last_names if last_name['last_name__count']) )
# This will create a dictionary where the keys are all the unique names and the values are querysect of all the values that have that lastname

Daniel-Roseman is right it is pretty inefficient so heres a tweak version ...

from collections import defaultdict
values = defaultdict(list)
_ = map(lambda person: values[person.last_name].append(person), Person.objects.all())

note that _ = ... is so we don't print all the None on the terminal ;)

samy's code is correct, but pretty inefficient: you do n+1 queries (where n is the number of unique last names). Since you're going to be getting all the objects in the table anyway, you might as well do it in one go. Use this instead:

from collections import defaultdict
person_dict = defaultdict(list)
persons = Person.objects.all()
for person in persons:
    person_dict[person.last_name].append(person)

Look at the regroup tag.

{% regroup persons by last_name as surname_list %}

<ul>
{% for last_name in surname_list %}
    <li>{{ last_name.grouper }}
    <ul>
        {% for person in last_name.list %}
          <li>{{ person.last_name }}, {{ person.first_name }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

(this code is untested, please read the docs and fix any problem yourself)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!