如何从另一个查询器的结果生成和显示Django查询集? [英] How do I generate and display Django querysets from the results of another queryset?
问题描述
类组(models.Model):
group_name = models.CharField(max_length = 20)
class Person(models.Model):
group = models.ForeignKey(Group)
name = models.CharField(max_length = 50)
我想列出所有组,每个组列表中都列出了组中的人员。 / p>
组A:Person1,Person2,Person3
组B:Person4,Person5,Person6
我被困在Group.objects.all()中,它只会返回一个包含可以在模板中循环访问的Group对象的查询集。我不知道如何循环通过每个群体的人。帮助?
groups = Group.objects.all()
{%for g in groups% }
g.group_name:
<<需要一个内循环来循环遍历每个人的群体? >>
{%endfor%}
使用内置重组
标签:
模板:
{%按人群将people分组为people_by_group%}
{%for people_by_group%}
{{group.grouper.group_name}}
{ %group%}
{{person}}
{%endfor%}
{%endfor%}
上下文:
{'people':Person.objects。 all()。select_related('group')。order_by('group')}
列出空组,但您可以在自己的视图中构建类似的结构,例如:
groups = list(Group。对于组中的g,
g.person_cache = []
for person.objects.all()中的person:
如果person.group_id不是None:
groups_map [person.group_ id] .person_cache.append(person)
del groups_map
#``groups``现在包含一个适合您的模板的列表
这样你只能做两个查询。在循环中使用相关管理器会产生 number_of_groups + 1
查询。
For example, let's say I have the following models:
class Group(models.Model):
group_name = models.CharField(max_length=20)
class Person(models.Model):
group = models.ForeignKey(Group)
name = models.CharField(max_length=50)
I want to list all groups, and for each group list the people in the group.
Group A: Person1, Person2, Person3
Group B: Person4, Person5, Person6
I get stuck at Group.objects.all(), which will only return a queryset containing the Group objects that I can cycle through in the template. I don't know how to cycle through the people in each group though. Help?
groups = Group.objects.all()
{% for g in groups %}
g.group_name:
<< Need an inner loop here to cycle through the people in each group? >>
{% endfor %}
You can use the builtin regroup
tag:
Template:
{% regroup people by group as people_by_group %}
{% for group in people_by_group %}
{{ group.grouper.group_name }}
{% for person in group.list %}
{{ person }}
{% endfor %}
{% endfor %}
Context:
{'people': Person.objects.all().select_related('group').order_by('group')}
This won't list empty groups, but you can build a similar strucutre in your own view, for example:
groups = list(Group.objects.all())
groups_map = dict((g.pk, g) for g in groups)
for g in groups:
g.person_cache = []
for person in Person.objects.all():
if person.group_id is not None:
groups_map[person.group_id].person_cache.append(person)
del groups_map
# ``groups`` now contains a list suitable for your template
This way you make only two queries. Using a related manager in a loop will produce number_of_groups+1
queries.
这篇关于如何从另一个查询器的结果生成和显示Django查询集?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!