这是代码,
user_obj = Q(first_name__icontains=query) | Q(last_name__icontains=query)
这会查找名字或姓氏,但如果我一次搜索两者,则不会显示结果。
如何查询“名字”,“姓氏”和&还有'全名'?
答案 0 :(得分:0)
简单的解决方案(不理想)是检查查询中的空间并将其拆分为第一部分作为名字并保留为最后一部分:
if ' ' in query:
first_name, last_name = query.split(' ', 1)
else:
first_name = query
last_name = None
filters = Q(first_name__icontains=first_name)
if last_name:
filters |= Q(last_name__icontains=last_name)
qs = User.objects.filter(filters)
如果查询包含space
,上面的解决方案是尝试使用拆分方法查找名字和姓氏,更好的解决方案是更智能地解析名称,您可以尝试nameparser:
from nameparser import HumanName
name = HumanName(query)
first_name = name.first
last_name = name.last
# prepare Q objects as mentioned above
更好的解决方案是使用Elasticsearch,Whoosh等高级搜索引擎
答案 1 :(得分:0)
您可以使用functions.Concat
构建全名,然后注释 full_name
字段到您的查询集,稍后将在{{1}提供的查询中使用object:
Q