Как я могу фильтровать по полю "многие-ко-многим" в другой таблице Django ORM?
Мои модели:
class Job:
id = models.UUIDField()
name = models.CharField()
category = models.ForeignKey(Category)
class JobReviewers:
user_id = models.UUIDField()
name = models.CharField()
categories = models.ManyToManyField(Category, related_name='reviewers')
class Category:
id = models.UUIDField()
Я хочу отфильтровать все вакансии, в которых пользователь является рецензентом, по имени и категории
user_id = uuid.uuid4()
all_jobs = Job.objects.all()
jobs_where_user_is_reviewer = ...
Если это будет фильтр только по имени без категории, я могу написать так:
job_names_where_user_reviewer = JobReviewers.objects.filter(user_id=user_id).values('name', flat=True)
jobs_where_user_is_reviewer = all_jobs.filter(name__in=job_names_where_user_reviewer)
Как я могу сделать это с помощью поля категорий m2m?
Попытка:
category_id = uuid.uuid4()
my_jobs = all_jobs.filter(name__in=job_names_where_user_reviewer, category__id=category_id)
Если я правильно понял, вы хотите получить Job
, для которых совпадает name
, а category
находится в categories
из JobReviewers
, где user_id
относится к данному user_id
.
Мы можем сделать это с помощью Exists
подзапроса [Django-doc]:
from django.db.models import Exists, OuterRef
Job.objects.filter(
Exists(
JobReviewers.objects.filter(
name=OuterRef('name'), categories=OuterRef('category'), user_id=user_id
)
)
)