Как я могу фильтровать по полю "многие-ко-многим" в другой таблице 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
        )
    )
)
Вернуться на верх