如何从另一个查询集的结果生成和显示Django查询集?

时间:2010-12-21 17:49:06

标签: django django-queryset

例如,假设我有以下模型:

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 %}

3 个答案:

答案 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可以识别您何时转移到新组并将其打印出来。

希望有所帮助。