复杂的Q查询

时间:2017-09-18 23:12:50

标签: python django

这是代码,

user_obj = Q(first_name__icontains=query) | Q(last_name__icontains=query)

这会查找名字或姓氏,但如果我一次搜索两者,则不会显示结果。

如何查询“名字”,“姓氏”和&还有'全名'?

2 个答案:

答案 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