在Django中查询全名

时间:2011-10-06 23:42:46

标签: python django

如何查询Django中的全名?

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

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

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

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

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

6 个答案:

答案 0 :(得分:13)

这个问题是很久以前发布的,但我遇到了类似的问题,并且在这里找到答案非常糟糕。接受的答案仅允许您通过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)

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

答案 1 :(得分:9)

更容易:

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

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

答案 2 :(得分:3)

除非我遗漏了某些内容,否则您可以使用python查询您的数据库,如下所示:

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

修改 回答你的问题:

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

User.objects.filter(first_name__contains='John', last_name__contains='Smith') 

这转换为:

SELECT * FROM USERS
WHERE first_name LIKE'%John%' 
AND last_name LIKE'%Smith%'

答案 3 :(得分:3)

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 )

答案 4 :(得分:0)

这个怎么样:

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)

尝试并测试过!

答案 5 :(得分:0)

我使用此查询来搜索名字,姓氏和全名。

它解决了我的问题。

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