#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=Случай … однако в шаблоне «заявитель в заявителях» в конечном итоге ссылается на модель позиции