Django сравнивает два набора запросов и добавляет пользовательский объект

#python #django #append #compare #django-queryset

#python #django #добавить #Сравнить #django-queryset

Вопрос:

У меня есть две модели

 class Position(models.Model):
    ...   
    job_seekers = models.ManyToManyField(settings.AUTH_USER_MODEL)

class Applicants(models.Model):
    position = models.ForeignKey(Position, on_delete=models.CASCADE)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
  

Я пытаюсь добавить пользовательскую переменную «selected» в свой набор запросов, чтобы отслеживать пользователей, которые появляются как в поле job_seekers ManyToMany, так и в модели соискателей, используя следующий код.

 views.py
        position = get_object_or_404(Position, pk=self.object.pk)
        applicants = Applicant.objects.filter(position=position)
        result_list = position.job_seekers.annotate(selected=F(applicant__user))
  

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

  {% if applicant.pk == applicant.selected %}
  

Как я могу это сделать без необходимости изменять структуру базы данных?

Спасибо

Ответ №1:

Возможно, вы можете попробовать так, используя условное выражение (регистр):

 from django.db.models import Case, When, F, Value

applicants = Applicant.objects.filter(position=position).annotate(
    is_selected=Case(
        When(
            user__in = F('position__job_seekers'),
            then=Value(True)
        ),
        default=Value(False),
        output_field=BooleanField()
    )
)
  

И используйте его в шаблоне:

 {% for applicant in applicants %}
    {% if applicant.is_selected %}
      // do something
    {% endif %}
{% endfor %}
  

Комментарии:

1. Частично работал при использовании position.job_seekers.filter(заявитель__позиция=позиция).аннотировать( is_selected=Случай … однако в шаблоне «заявитель в заявителях» в конечном итоге ссылается на модель позиции