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!