有2个具有多对多关系的模型。
class Record():
working_on_record = models.ManyToManyField(
UserProfile, related_name="working_on_record", blank=True)
class UserProfile():
name = CharField...
UserProfile只是基本的用户模型。
现在,我想查询记录搜索,并检查所有关键字是否匹配,但是如果匹配:
query = Q()
c1 = UserProfile.objects.filter(name__icontains='peter')
query.add(Q(working_on_record__in=c1), Q.AND)
c2 = UserProfile.objects.filter(name__icontains='john')
query.add(Q(working_on_record__in=c2), Q.AND)
set3 = list(models.Record.objects.filter(query))
Set3为空,尽管有一条记录,其中有两个人在工作,名字分别是“约翰·史密斯”和“彼得·帕克”。如果将c2中的“ john”替换为“ parker”,则会得到所有记录,其中“ peter parker”正在运行。
但是,如果我链接过滤方法:
set4 = list(models.Record.objects
.filter(working_on_record__in=c1)
.filter(working_on_record__in=c2)
)
set4不为空,包含我想要的记录。
是否可以更改Q查询,以便获得所需的行为? 是否可以通过Q查询对一个多对多关系进行过滤,并使用来自与AND连接的不同对象的不同值提供不同的值?
由于Q查询有多种可能的用法,我不喜欢链接过滤器方法的想法,因此我必须多次遍历所有查询并将其链接。