Как генерировать и отображать наборы запросов Django из результатов другого набора запросов? - PullRequest
4 голосов
/ 21 декабря 2010

Например, допустим, у меня есть следующие модели:

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)

Я хочу перечислить все группы, и для каждой группы перечислить людей в группе.

Группа А: Человек1, Человек2, Человек3
Группа B: человек4, человек5, человек6

Я застрял в 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 ]

1 голос
/ 21 декабря 2010

Вы можете использовать встроенный тег 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 запросов.

1 голос
/ 21 декабря 2010
0 голосов
/ 28 июля 2012

Вы должны фактически запросить людей вместо группы.

people = Person.objects.select_related().order_by('group')
{% for person in people %}
  {% ifchanged person.group %}
    {{ person.group }}
  {% endifchanged %}
  {{ person }}
{% endfor %}

Это делает один запрос для всех людей и их связанных групп, упорядоченных по группам.Измененный в шаблоне распознает, когда вы перешли в новую группу, и распечатывает ее.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...