Python Django:如何迭代两个多表关系?

Python Django:如何迭代两个多表关系?,python,django,Python,Django,我正在尝试构建一个查询三个表的简单网页。有一个公司表,它与职位表有一对多关系,与项目表也有一对多关系 目标是让页面显示一次给定的公司,以及与该公司相关的所有职位和项目。然后,继续显示下一家公司、在那里的任何职位和完成的项目 下面是我最接近正确的答案。但是,显而易见的问题是,如果有多个项目与给定的公司关联,您将看到该公司不止一次地列出 我是Django的新手,所以为了学习的兴趣,我想在寻求帮助之前好好地敲敲自己的脑袋;但在这一点上,我真的需要一些新的想法 另外:我可以看到嵌套for循环在这里是如何

我正在尝试构建一个查询三个表的简单网页。有一个
公司
表,它与
职位
表有一对多关系,与
项目
表也有一对多关系

目标是让页面显示一次给定的公司,以及与该公司相关的所有职位和项目。然后,继续显示下一家公司、在那里的任何职位和完成的项目

下面是我最接近正确的答案。但是,显而易见的问题是,如果有多个项目与给定的公司关联,您将看到该公司不止一次地列出

我是Django的新手,所以为了学习的兴趣,我想在寻求帮助之前好好地敲敲自己的脑袋;但在这一点上,我真的需要一些新的想法

另外:我可以看到嵌套for循环在这里是如何工作的,但我只是不清楚它的机制如何与查询一起工作,然后在模板中工作

型号:

from django.db import models


class Company(models.Model):
    company_id = models.AutoField(primary_key=True)
    company_name = models.CharField(max_length=20)
    company_logo = models.ImageField(upload_to='images/')    

    def __str__(self):
        return self.company_name   

class Position(models.Model):
    position_id = models.AutoField(primary_key=True)
    position_title = models.CharField(max_length=55)
    company_id = models.ForeignKey('professional.Company',
                               on_delete=models.CASCADE,
                               blank=True,
                               null=True)
    begin_date = models.DateField()
    end_date = models.DateField()   

    def __str__(self):
        return self.position_title   

class Project(models.Model):
    project_id = models.AutoField(primary_key=True)
    project_name = models.CharField(max_length=55)
    company_id = models.ForeignKey('professional.Company',
                               on_delete=models.CASCADE,
                               blank=True,
                               null=True)
    project_description = models.CharField(max_length=500)
    project_image = models.ImageField(upload_to='images/')

    def __str__(self):
        return self.project_name
视图:

HTML和模板:

{% for job in technology_list %}

    <h1>{{job.company_name}}</h1>
    <h1>Position: {{job.position__position_title}}</h1>
    <h1>project: {{job.project__project_name}}</h1>

{% endfor %}
{% for job in technology_list %}

    <h1>{{job.company_name}}</h1>
    {% for position in job.position_set.all() %}
        <h1>Position: {{position.position_title}}</h1>
    {% endfor %}
    {% for project in job.position_set.all() %}
        <h1>project: {{project.project_name}}</h1>
    {% endfor %}

{% endfor %}
{%用于技术中的作业\u列表%}
{{job.company_name}
职位:{{job.Position\u Position\u title}
项目:{{job.project\uuu project\u name}
{%endfor%}

如果你想迭代公司,那么你应该使用公司模型作为你观点的基础,而不是技术。此外,除非您知道自己有充分的理由,否则您应该避免使用
值列表
。您可以使用
prefetch\u related()
减少反向查询的数量。因此:

class TechnologyListView(ListView):
    def get_queryset(self):        
        return Company.objects.all.prefetch_related('project','position')

{%用于公司列表%中的公司]
{{公司.公司名称}
{company.position_set.all%}
位置:{{Position.Position_title}}
{%endfor%}
{company.project_set.all%}
项目:{{project.project_name}
{%endfor%}
{%endfor%}

(注意,您应该避免使用以“\u id”结尾的ForeignKey字段名称。)。Django字段指的是整个公司,而不是ID;这些字段应仅称为
公司
。无论如何,基础数据库将以
\u ID
作为后缀。此外,您不需要在所有字段上使用model\u name前缀;从访问这些字段的对象可以明显看出。)

您可以返回实际的查询集,然后对其进行迭代以构建视图,而不是
get\u queryset
方法中的值

def get_queryset(self):        
        return Company.objects.all()
然后在模板中:

{% for job in technology_list %}

    <h1>{{job.company_name}}</h1>
    <h1>Position: {{job.position__position_title}}</h1>
    <h1>project: {{job.project__project_name}}</h1>

{% endfor %}
{% for job in technology_list %}

    <h1>{{job.company_name}}</h1>
    {% for position in job.position_set.all() %}
        <h1>Position: {{position.position_title}}</h1>
    {% endfor %}
    {% for project in job.position_set.all() %}
        <h1>project: {{project.project_name}}</h1>
    {% endfor %}

{% endfor %}
{%用于技术中的作业\u列表%}
{{job.company_name}
{%用于作业中的位置。位置\集合.all()%}
职位:{{Position.Position_title}
{%endfor%}
{%用于作业中的项目。位置_set.all()%}
项目:{{project.project_name}
{%endfor%}
{%endfor%}

非常好的建议,我将继续遵循。谢谢你的见解。我很快就完成了。我只是有几个语法问题
position_set.all()
需要移除Paran以使其
position_set.all
;第二个内部循环需要是
job.project\u set.all
,它成功了!谢谢你的帮助,@Pranav!