Django Q对象AND操作不起作用

时间:2018-01-24 16:35:13

标签: django django-queryset

我有一个带过滤器的人的列表视图。过滤器具有以下代码:

    if textquery:
        qs = qs.filter()

        qs = qs.filter(Q(name__icontains=textquery) |
                       Q(surname__icontains=textquery) |
                       Q(surname__icontains=textquery) & Q(name__icontains=textquery)
                       )


    return qs

人们可以同时拥有名字和姓氏,并按预期搜索这些作品。但是,当我同时输入第一个和最后一个名字时,程序不会返回任何结果(即使我认为最后的操作应包括两个变量)。

总结:这是我查询的结果:

Person: 'John Doe' 
Query:  'John' 
Result: 'John Doe' 

Person: 'John Doe' 
Query: 'Doe'
Result: 'John Doe'

Person 'John Doe'
Query: 'Johh Doe'
Result: ''

有谁知道我做错了什么,为什么NA​​ME和SURNAME的匹配都没有返回任何结果?

3 个答案:

答案 0 :(得分:2)

过滤器不返回任何内容,因为当前代码检查firstname或lastname是否包含FULL名称。这将每次返回False。例如。 virtual void foo() = 0不包含John。因此,您需要将textquery解析为name和surname:

John Doe

答案 1 :(得分:2)

@neverwalkaloner说对了。您可以使用他的解决方案或尝试下面的解决方案,它将名称和姓氏结合在一起,使解决方案更加灵活。所以现在即使textquery是“n D”,它仍然匹配。

from django.db.models.functions import Concat
from django.db.models import F, Value

qs = qs.annotate(fullname=Concat(F('name'), Value(' '), F('surname')))\
            .filter(fullname__icontains=textquery)

答案 2 :(得分:0)

您的查询工作正常。

$lesson->student->school->schoolType

也是对的。 试着去理解。 John Doe既不与John匹配,也不与Doe匹配。