如何查询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'。
答案 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)
)