django Q作为链接的.filter()

时间:2018-10-31 10:02:22

标签: django django-queryset django-q

有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查询有多种可能的用法,我不喜欢链接过滤器方法的想法,因此我必须多次遍历所有查询并将其链接。

0 个答案:

没有答案