搜索多个

时间:2010-12-12 01:55:08

标签: django

我的搜索功能会通过以下任何一种方式接收搜索字词:

  • first_name“thomas”
  • last_name“smith”
  • first_name last_name“thomas smith”

我正在尝试构建一个查询集,它将通过任何这些术语找到客户端“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”。我怎样才能按照描述重写它?

1 个答案:

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