首页 > 解决方案 > 如何通过发送与模型相关的 objects.all() 来获取外键

问题描述

我不知道如何在模板中检索与外键相关的数据。我将向您展示我现在拥有的东西,这将为您解决问题。

公司简介:

class CompanyProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, related_name='company_profile')
company_name = models.CharField(max_length=30)


def __str__(self):
    return self.company_name

工作:

class Job(models.Model):
user = models.ForeignKey(CompanyProfile, on_delete=models.CASCADE)
title = models.CharField(max_length=300)
is_active = models.BooleanField(default=True)

def __str__(self):
    return self.title

工作职能:

class JobFunction(models.Model):
job = models.ForeignKey(Job, on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=60)

def __str__(self):
    return self.name

风景:

def show_jobs(request):
jobs = Job.objects.all()
job_type = JobFunction.objects.all()

context = {
   'jobs': jobs,
   'job_type': job_type,

}

return render(request, 'jobportal/jobs/browse-job.html', context, {
})

一个 Job 可以有多个 Job Functions,或者只有 1 个没关系,但我需要得到 JobFunction 与 Job 相关的那个。我执行以下操作:

{% for job in jobs %}
 {{ job.title }}
 {% for jf in job_type %}
  {{ jf.name }}
 {% endfor %}
{% endfor %}

“工作”显示一切正常,但 jf 不是动态的,它在列表中的所有工作中显示相同的功能。循环有一个 id,我的意思是我想说 job.id = job_type.id 但我该怎么做呢?我想为每个工作项显示与特定工作/公司相关的 job_functions。

标签: pythondjango

解决方案


无需传递JobFunctions 的列表,您可以使用 反向查询关系job.jobfunction_set

{% for job in jobs %}
  {{ job.title }}
  {% for jf in job.jobfunction_set.all %}
    {{ jf.name }}
  {% endfor %}
{% endfor %}

请注意,在您看来,您最好使用.prefetch_related(..)调用 [Django-doc]在一个数据库调用中获取所有相关JobFunction的 s,并在 Django/Python 级别执行“加入”过程:

def show_jobs(request):
    jobs = Job.objects.prefetch_related('jobfunction')
    context = {
       'jobs': jobs
    }
    return render(request, 'jobportal/jobs/browse-job.html', context)

推荐阅读