如何在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)
那我该如何处理这个有多个类别的字段呢?
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
在某个JobReviewers
的categories
里,而这个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
)
)
)