Как получить внешний ключ с отправкой objects.all (), связанной с моделью - PullRequest
1 голос
/ 20 января 2020

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

CompanyProfile:

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

JobFunction:

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, {
})

В одном задании может быть несколько функций, или только в 1 это не выполняется. это не имеет значения, но мне нужно получить тот, где JobFunction связана с работой. Я делаю следующее:

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

«Работа» показывает все отлично, но jf не динамический c, он показывает те же функции во всех работах в списке. У l oop есть идентификатор, я хочу сказать, что job.id = job_type.id, но как я могу это сделать? Я хочу показать для каждого элемента задания job_functions, которые связаны с указанным c заданием / компанией.

1 Ответ

1 голос
/ 20 января 2020

Нет необходимости передавать список JobFunction s, вы можете запросить отношение в обратном порядке с помощью job.jobfunction_set:

{% for job in jobs %}
  {{ job.title }}
  {% for jf in <b>job.jobfunction_set.all</b> %}
    {{ jf.name }}
  {% endfor %}
{% endfor %}

Обратите внимание, что, по вашему мнению, вам лучше использовать .prefetch_related(..) call [Django -doc] , чтобы получить все связанные JobFunction s в одном вызове базы данных и выполнить процесс "соединения" на уровне Django / Python :

def show_jobs(request):
    jobs = Job.objects<b>.prefetch_related('jobfunction')</b>
    context = {
       'jobs': jobs
    }
    return render(request, 'jobportal/jobs/browse-job.html', context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...