Django Q对象AND操作不工作

tpxzln5u  于 2023-08-08  发布在  Go
关注(0)|答案(3)|浏览(158)

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

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的匹配都没有返回任何结果?

8wtpewkr

8wtpewkr1#

过滤器不返回任何东西,因为当前代码检查名字或姓氏是否包含FULL name。每次都将返回False。John不包含John Doe。所以你需要将textquery解析为name和姓氏:

if textquery:
    qs = qs.filter()
    name, surname = textquery.split()
    qs = qs.filter(Q(name__icontains=textquery) |
                   Q(surname__icontains=textquery) |
                   Q(surname__icontains=name) & Q(name__icontains=surname)
                   )

字符串

gr8qqesn

gr8qqesn2#

@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)

字符串

oprakyz7

oprakyz73#

您的查询工作正常。

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

字符串
也是正确的。试着理解。无名氏与约翰和无名氏都不匹配。

相关问题