如何从另一个查询器的结果生成和显示Django查询集? [英] How do I generate and display Django querysets from the results of another queryset?

查看:214
本文介绍了如何从另一个查询器的结果生成和显示Django查询集?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 类组(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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆