如何在Django ORM中通过其他表的多对多字段筛选?

0 投票
2 回答
22 浏览
提问于 2025-04-13 15:30

我的模型:

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)

那我该如何处理这个有多个类别的字段呢?

2 个回答

0

试试这个:

category_id = uuid.uuid4()
my_jobs = all_jobs.filter(name__in=job_names_where_user_reviewer, category__id=category_id)
2

如果我理解得没错,你想找出那些name匹配的Job,并且它们的category在某个JobReviewerscategories里,而这个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
        )
    )
)

撰写回答