例如,假设我有以下模型:
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)
我想列出所有群组,并为每个群组列出群组中的人员。
A组:Person1,Person2,Person3
B组:Person4,Person5,Person6
我遇到了Group.objects.all(),它只会返回一个包含我可以在模板中循环的Group对象的查询集。我不知道如何绕过每个小组的人。帮助
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 %}
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以使用内置regroup
标记:
模板:
{% 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 %}
上下文:
{'people': Person.objects.all().select_related('group').order_by('group')}
这不会列出空组,但您可以在自己的视图中构建类似的结构,例如:
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
这样您只需要进行两次查询。在循环中使用相关管理器将产生number_of_groups+1
个查询。
答案 2 :(得分:0)
您需要实际查询人而不是群组。
people = Person.objects.select_related().order_by('group')
{% for person in people %}
{% ifchanged person.group %}
{{ person.group }}
{% endifchanged %}
{{ person }}
{% endfor %}
这是按群组排序的所有人及其相关群组的一个查询。模板中的ifchanged可以识别您何时转移到新组并将其打印出来。
希望有所帮助。