【问题标题】:How can I make a search form working with "Name Surname"如何使用“姓氏”制作搜索表单
【发布时间】:2020-10-12 23:23:14
【问题描述】:

基本上问题是,如果我搜索确切的“姓名”或确切的“姓氏”,我的搜索栏正在工作,但是,如果用户搜索“姓名姓氏”甚至如果用户拼错了姓名或姓氏,但至少有一个是正确的。

def search(request):
    query = request.GET.get("q", None)
    qs = DeathAd.objects.all()
    if query is not None:
        qs = qs.filter(
            Q(nome__icontains=query) |
            Q(cognome__icontains=query)
        )
    context = {
        "object_list": qs,
    }
    template = "search.html"
    return render(request, template, context)

【问题讨论】:

    标签: python django search


    【解决方案1】:

    您可以使用name、空格和cognameConcat [Django-doc]cogname.annotate(…) [Django-doc] 查询集:

    from django.db.models import Value
    from django.db.models.functions import Concat
    
    qs = qs.annotate(
        full_name=Concat('nome', Value(' '), 'cognome')
    ).filter(
        Q(nome__icontains=query) |
        Q(cognome__icontains=query) |
        Q(full_name__icontains=query)
    )

    (...) 或者即使用户拼错了姓名或姓氏,但至少两者中的一个是正确的。

    为此,您将需要更高级的搜索技术,例如 Elasticsearch 后端,并且您可以利用 django-haystack [readthedocs] 与这些后端进行对话。

    【讨论】:

    • 谢谢您,先生,您的解决方案似乎效果很好,您的猜测很有见地
    • 有什么建议可以将分页器添加到这个视图中吗?
    【解决方案2】:

    也许在那里做一些蟒蛇。为什么不用 ' ' 破折号拆分查询,将姓名和姓氏分隔成一个列表。然后创建一个空列表来追加。像这样,

    def search(request):
    query = request.GET.get("q", None).split(' ')
    q_list = []
    if query is not None:
        for qs in query:
        result = DeathAd.objects.filter(qs)
        q_list.append(result)
    context = {
        "object_list": q_list,
    }
    template = "search.html"
    return render(request, template, context)
    

    如果你愿意,你可以使用集合以防出现重复的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-05-05
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多