为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

手掌心 2023-10-31 16:32:53
基本上问题是,目前如果我搜索确切的“姓名”或确切的“姓氏”,我的搜索栏正在工作,但是,如果用户搜索“姓名”或者即使用户搜索“姓氏”,我希望它也能工作。名字或姓氏拼写错误,但两者中至少有一个是正确的。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)
查看完整描述

2 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

您可以使用、 空格和的[ .annotate(…)Django-doc]来Concat[Django-doc]查询集:namecogname


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]与这些后端进行对话。


查看完整回答
反对 回复 2023-10-31
?
HUX布斯

TA贡献1876条经验 获得超6个赞

也许在那里做一些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)

如果需要,您可以使用集合以防出现重复结果


查看完整回答
反对 回复 2023-10-31
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信