在Django中查询全名

21 python django

如何在Django中查询全名?

为了澄清,我基本上想要创建一个临时列,结合first_name和last_name来给出一个全名,然后对它做一个LIKE,如下所示:

select [fields] from Users where CONCAT(first_name, ' ', last_name) LIKE '%John Smith%";
Run Code Online (Sandbox Code Playgroud)

上面的查询将返回名为John Smith的所有用户.如果可能,我想避免使用原始SQL调用.

我正在谈论的模型是股票django.contrib.auth.models用户模型.直接更改模型不是问题.

例如,如果用户要搜索"John Paul Smith",则应匹配名为"John Paul"和姓氏"Smith"的用户,以及名字为"John"和姓氏的用户保罗史密斯'.

小智 20

这个问题是很久以前发布的,但我遇到了类似的问题,在这里找到答案非常糟糕.接受的答案仅允许您通过first_name和last_name查找完全匹配.第二个答案稍微好一些,但仍然很糟糕,因为你在数据库中找到了尽可能多的单词.这是我的解决方案,连接first_name和last_name注释它并在此字段中搜索:

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)
Run Code Online (Sandbox Code Playgroud)

例如,如果这个人的名字是John Smith,你可以通过输入john smith,john,smith,hn smi等找到他.它仅攻击数据库.我认为这将是您在开放帖子中想要的确切SQL.

  • 祝福你。在最初的问题提出 7 年后发布更好的解决方案值得尊重。 (2认同)

laf*_*ste 11

更轻松:

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
Run Code Online (Sandbox Code Playgroud)

其中query_name可以是"John Smith"(但如果有的话,还会检索用户Smith John).


S.L*_*ott 5

class User( models.Model ):
    first_name = models.CharField( max_length=64 )
    last_name = models.CharField( max_length=64 )
    full_name = models.CharField( max_length=128 )
    def save( self, *args, **kw ):
        self.full_name = '{0} {1}'.format( first_name, last_name )
        super( User, self ).save( *args, **kw )
Run Code Online (Sandbox Code Playgroud)


gar*_*rtb 3

除非我遗漏了什么,否则您可以使用 python 来查询数据库,如下所示:

from django.contrib.auth.models import User
x = User.objects.filter(first_name='John', last_name='Smith') 
Run Code Online (Sandbox Code Playgroud)

编辑: 回答你的问题:

如果您需要在用户搜索“John Smith”时返回“John Paul Smith”,那么您可以使用“ contains ”,它会转换为 SQL LIKE。如果您只需要存储名称“John Paul”的容量,请将两个名称都放入first_name 列中。

User.objects.filter(first_name__contains='John', last_name__contains='Smith') 
Run Code Online (Sandbox Code Playgroud)

这可以翻译为:

SELECT * FROM USERS
WHERE first_name LIKE'%John%' 
AND last_name LIKE'%Smith%'
Run Code Online (Sandbox Code Playgroud)

  • 如果查询是“John Paul Smith”,会发生什么? (2认同)