我的搜索功能会通过以下任何一种方式接收搜索字词:
我正在尝试构建一个查询集,它将通过任何这些术语找到客户端“thomas”,但如果两个名称都将结果缩小到“thomas smith”而不是“thomas jones”或“george smith”提供。
我已经做了很多关于如何使用过滤器,Q对象,字符串拆分和for循环来完成这项工作的研究,但到目前为止还没有运气。
MODEL:
class Client(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
VIEW:
def search(request):
query = request.GET.get('s', '').strip()
if query:
client_set = (
(Q(first_name__in=query) & Q(last_name__in=query)) |
Q(first_name__icontains=query) |
Q(last_name__icontains=query)
)
else:
client_list = []
return render_to_response("search.html", {
"client_list": client_list,
"query": query
},context_instance=RequestContext(request))
上面的代码在搜索“thom”时有效,但找不到“thomas smith”。我怎样才能按照描述重写它?
答案 0 :(得分:1)
我相信这应该做你想要的:
def search(request):
name = request.GET.get('s', '').strip().split(' ', 1)
client_set = Client.objects.all()
if len(name) == 2:
first_name, last_name = name
client_set = client_set.filter(
first_name__icontains=first_name,
last_name__icontains=last_name,
)
else:
name = name[0]
client_set = client_set.filter(
client_set.filter(first_name__icontains=name)
| client_set.filter(last_name__icontains=name)
)
return render_to_response("search.html", {
"client_list": client_list,
"query": query
}, context_instance=RequestContext(request))