Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中查询全名_Python_Django - Fatal编程技术网

Python 在Django中查询全名

Python 在Django中查询全名,python,django,Python,Django,如何查询Django中的全名 为了澄清,我基本上想创建一个临时列,结合名字和姓氏来给出一个全名,然后在上面做一个类似的操作,如下所示: select [fields] from Users where CONCAT(first_name, ' ', last_name) LIKE '%John Smith%"; 上述查询将返回名为John Smith的所有用户。如果可能,我希望避免使用原始SQL调用 我具体谈论的模型是stock django.contrib.auth.models用户模型。直

如何查询Django中的全名

为了澄清,我基本上想创建一个临时列,结合名字和姓氏来给出一个全名,然后在上面做一个类似的操作,如下所示:

select [fields] from Users where CONCAT(first_name, ' ', last_name) LIKE '%John Smith%";
上述查询将返回名为John Smith的所有用户。如果可能,我希望避免使用原始SQL调用

我具体谈论的模型是stock django.contrib.auth.models用户模型。直接修改模型不是问题


例如,如果用户要搜索“John Paul Smith”,它应该匹配名为“John Paul”和姓为“Smith”的用户,以及名为“John”和姓为“Paul Smith”的用户。

除非我遗漏了什么,否则可以使用python这样查询数据库:

from django.contrib.auth.models import User
x = User.objects.filter(first_name='John', last_name='Smith') 
编辑: 回答你的问题:

如果用户搜索“John Smith”时需要返回“John Paul Smith”,则可以使用“”将其转换为类似SQL的语句。如果您只需要存储名称“John Paul”,请将这两个名称都放在“名字”列中

User.objects.filter(first_name__contains='John', last_name__contains='Smith') 
这意味着:

SELECT * FROM USERS
WHERE first_name LIKE'%John%' 
AND last_name LIKE'%Smith%'
更容易:

from django.db.models import Q 

def find_user_by_name(query_name):
   qs = User.objects.all()
   for term in query_name.split():
     qs = qs.filter( Q(first_name__icontains = term) | Q(last_name__icontains = term))
   return qs
其中查询名称可以是“John Smith”(但如果有,也会检索用户Smith John)

这个呢:

query = request.GET.get('query')
users = []

try:
    firstname = query.split(' ')[0]
    lastname  = query.split(' ')[1]
    users += Users.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname)
    users += Users.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname)

users = set(users)

久经考验

这个问题很久以前就发布了,但我遇到了类似的问题,在这里找到的答案非常糟糕。接受的答案只允许您通过名字和姓氏找到精确的匹配项。第二个答案稍微好一点,但仍然不好,因为您访问数据库的次数和访问单词的次数一样多。 下面是我的解决方案,它将名字和姓氏连接起来,并在该字段中进行注释和搜索:

from django.db.models import Value as V
from django.db.models.functions import Concat   

users = User.objects.annotate(full_name=Concat('first_name', V(' '), 'last_name')).\
                filter(full_name__icontains=query)

例如,如果此人的名字是John Smith,您可以通过键入John Smith、John、Smith、hn smi等来找到他。它只命中数据库中的一个。我想这正是您在公开文章中想要的SQL。

我使用此查询来搜索firstname、lastname和fullname

它解决了我的问题

from django.db.models import Q, F
from django.db.models import Value as V
from django.db.models.functions import Concat 

user_list = models.User.objects.annotate(
                        full_name=Concat('first_name', V(' '), 'last_name')
                    ).filter(   
                        Q(full_name__icontains=keyword) | 
                        Q(first_name__icontains=keyword) | 
                        Q(last_name__icontains=keyword)
                    )

请包括您的Django型号。如果您想要一个“派生值”(如SQL中的
CONCAT(first\u name',last\u name)
),您必须将其添加到模型中。因此,在你的问题中包括模型。顺便说一句,你知道像“%John Smith%”这样的
CONCAT(名字,,,姓氏)吗“
效率极低?使用名为“%John”和姓为“Smith%”的
会更有效吗?为什么在有非CONCAT方法的情况下使用CONCAT?它是标准的django.contrib.auth.models用户模型。我们已经在这个模型中添加/更改字段,所以修改不是问题。“在这个模型中添加/更改字段”为什么不使用配置文件扩展@我没有意识到效率问题,谢谢你指出这一点。对于我们的应用程序,查询用户是一个单独的字段,所以我不能只使用空格。如果查询是“John Paul Smith”,会发生什么?如果first_name==“John Paul”或last_name==“Paul Smith”,它仍将以这种方式匹配。我要说的是,如果用户键入John Paul Smith怎么办?
(名字像“%John”或名字像“%John Paul”)和(姓像“Paul Smith%”或姓像“Smith%”)
以姓氏命名。它避免了昂贵且不可索引的CONCAT。我已经开始使用它,只要有多个搜索词,http响应时间就会从100ms变为5秒。你知道为什么会这样吗?你必须首先指出问题出在哪里。数据库?ORM?模板?执行查询sql客户端中的(
print qs.query
)以查看问题是否在数据库中。如果不是,则通过排除(删除代码片段)尝试猜测其是否在模板中。如果不是,则可能在ORM上(尝试返回较少行的查询)。您将面临ORM N+1问题(使用
选择相关的
预取相关的
修复它).通过使用EXPLAIN(mysql/postgres)和查询(来自sql客户机),您能猜出什么错误吗?您的表是否庞大?如果是这样,索引名字和姓氏是否可以缓解问题?感谢提示“但仍然很糟糕,因为您访问数据库的次数与单词数一样多”->django查询是,它只命中db一次。
Concat
注释生成一个非常复杂的sql语句。功能上唯一的区别是您的答案允许包含在串联中(如您所指出的,“hn smi”f.e.),而我的答案允许包含在任一列中(例如搜索“John Smith”或“Smith John”这两个词都会与“John Fitzgerald”和“John Fitzgerald”和“John Fitzgerald”匹配一行。这应该是公认的答案。其他答案不能正确回答问题。祝福你。在最初的问题7年后发布更好的解决方案值得尊重。这是一个非常优雅的解决方案
from django.db.models import Q, F
from django.db.models import Value as V
from django.db.models.functions import Concat 

user_list = models.User.objects.annotate(
                        full_name=Concat('first_name', V(' '), 'last_name')
                    ).filter(   
                        Q(full_name__icontains=keyword) | 
                        Q(first_name__icontains=keyword) | 
                        Q(last_name__icontains=keyword)
                    )