我有一个django应用程序,可以从一个用户表中检索所有主题。我还实现了输入搜索表单, 这是执行的查询:
all_soggs = Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname')
if(all_soggs.count()==0):
all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname')
您可以看到查询首先按姓氏搜索匹配的项目,然后按名字搜索。这是有效的,直到我插入完整的名称'firstaname lastname'或'lastname firstname',在这种情况下,没有结果。如何修改查询以进行更好的搜索?
谢谢 - 卢克
答案 0 :(得分:8)
复制/粘贴自:https://stackoverflow.com/a/17361729/1297812
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
答案 1 :(得分:7)
You need Q objects您还需要将查询拆分为单独的术语(因为没有名字与完整字符串“Firstname Lastname”匹配)。
这是一个匹配搜索“名字姓氏”中以“名字”或“姓氏”开头的任何名字或姓氏的想法。
这是一般搜索 - 调整查询以满足您的特定需求!
编辑:oops,我真的不喜欢使用reduce,因为它看起来很混乱,但是这些需要一起进行OR运算,因为术语的数量未知,我们不能做更详细的版本。
import operator
from django.db.models import Q
search_args = []
for term in request.GET['query_term'].split():
for query in ('first_name__istartswith', 'last_name__istartswith'):
search_args.append(Q(**{query: term}))
all_soggs = Entity.objects.filter(reduce(operator.or_, search_args))
为了阐明如何使用Q对象,给定搜索“Firstname Lastname”,前一个查询等于:
Entity.objects.filter(
Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") |
Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname")
)
答案 2 :(得分:0)
类似的问题:Querying full name in Django
query = request.GET.get('query')
entities = []
try:
firstname = query.split(' ')[0]
lastname = query.split(' ')[1]
entities += Entity.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname)
entities += Entity.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname)
entities = set(entities)