如何制作使用“姓名”的搜索表单

基本上问题是,目前如果我搜索确切的“姓名”或确切的“姓氏”,我的搜索栏正在工作,但是,如果用户搜索“姓名”或者即使用户搜索“姓氏”,我希望它也能工作。名字或姓氏拼写错误,但两者中至少有一个是正确的。


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)


手掌心
浏览 93回答 2
2回答

墨色风雨

您可以使用、 空格和的[ .annotate(…)Django-doc]来Concat[Django-doc]查询集:namecognamefrom django.db.models import Valuefrom django.db.models.functions import Concatqs = 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]与这些后端进行对话。

HUX布斯

也许在那里做一些Python。为什么不使用“ ”破折号分割查询,将名字和姓氏分隔到一个列表中。然后创建一个空列表来追加。像这样,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)如果需要,您可以使用集合以防出现重复结果
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python