Как запросить две модели в представлении класса, получить конкретные атрибуты, связанные с каждой моделью, и сравнить одну запись с другой - PullRequest
1 голос
/ 15 октября 2019

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

models.py

class Job(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    years_of_experience = models.IntegerField(blank=True, null=True)

class Applicants(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='applicants')
    experience = models.IntegerField(blank=True, null=True)

views.py

class QualifiedApplicantPerJobView(ListView):
    model = Applicants
    template_name = 'qualified_applicants.html'
    context_object_name = 'applicants'
    paginate_by = 2

    @method_decorator(login_required(login_url=reverse_lazy('login')))
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(self.request, *args, **kwargs)

    def get_queryset(self):
        return Applicants.objects.filter(job_id=self.kwargs['job_id']).order_by('-id')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['job'] = Job.objects.get(id=self.kwargs['job_id'])
        return context

Applicants.html

{% for applicant in applicants %}
   {% if applicant.experience >= job.years_of_experience %}
    <div class="col-lg-6">
       <div class="box applicant">
            <h4>{{ applicant.user.get_full_name }}</h4>
            <h4>{{ applicant.user.email }}</h4>
       </div>
   {% endif %}
{% endfor %}

Я не хочу делать это так, я хочу иметь возможность делать это в моих взглядах, получитьколичество квалифицированных заявителей (количество) и возврат квалифицированных кандидатов. Каков наилучший способ приблизиться к этому. Спасибо

1 Ответ

1 голос
/ 15 октября 2019

Вы можете добавить дополнительный аргумент к filter.

Конечно, сначала вам нужно будет получить работу, для которой вы хотите получить доступных кандидатов, чтобы вы могли определить years_of_experience, необходимый для работы с указанным идентификатором.

Затем можно использовать аргумент фильтра __gte, чтобы отфильтровать кандидатов с полем experience, превышающим требуемое количество лет. Это указано в разделе «Поиск в полях» в документах.

Подводя итог:

def get_queryset(self):
    # First we get the job itself.
    job = Job.objects.get(pk = self.kwargs['job_id'])

    # Add an extra argument to the filter method.
    return Applicants.objects
                .filter(job=job, experience__gte = job.years_of_experience)
                .order_by('id')

Затем можно пропустить

* 1017. *{% if applicant.experience >= job.years_of_experience %} ... {% endif %}

выписка из вашего шаблона.

...