我有一个带过滤器的人的列表视图。过滤器具有以下代码:
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: ''
有谁知道我做错了什么,为什么NAME和SURNAME的匹配都没有返回任何结果?
答案 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匹配。