django queryset -搜索名字和姓氏

svmlkihl  于 2023-08-08  发布在  Go
关注(0)|答案(4)|浏览(130)

我有一个Django应用程序,可以从一个用户表中检索所有主题。我还实现了一个输入搜索表单,这是执行的查询:

all_soggs =     Entity.objects.filter(lastname__istartswith=request.GET['query_term']).order_by('lastname')
if(all_soggs.count()==0):
    all_soggs = Entity.objects.filter(firstname__istartswith=request.GET['query_term']).order_by('firstname')

字符串
如您所见,查询首先按姓氏搜索匹配项,然后按名字搜索。直到我插入完整的名字'firstaname lastname'或'lastname firstname',在这种情况下没有结果.我如何修改查询以使一个更好的搜索?
谢谢-卢克

jfgube3f

jfgube3f1#

复制/粘贴自:https://stackoverflow.com/a/17361729/1297812

from django.db.models import Q 

def find_user_by_name(query_name):
   qs = User.objects.all()
   for term in query_name.split():
     qs = qs.filter( Q(first_name__icontains = term) | Q(last_name__icontains = term))
   return qs

字符串

33qvvth1

33qvvth12#

您需要Q对象,还需要将查询拆分为单独的术语(因为没有名字会匹配完整的字符串“Firstname”)。
这里有一个想法,匹配任何名或姓开始的“Firstname”搜索“Firstname”或“Lastname”。
这是一个通用搜索-调整查询以满足您的特定需求!
编辑:哎呀,我真的不喜欢使用reduce,因为它看起来很混乱,但是这些需要一起进行OR运算,我们不能做一个更详细的版本,因为术语的数量是未知的。

import operator
from django.db.models import Q

search_args = []
for term in request.GET['query_term'].split():
    for query in ('first_name__istartswith', 'last_name__istartswith'):
        search_args.append(Q(**{query: term}))

all_soggs = Entity.objects.filter(reduce(operator.or_, search_args))

字符串
为了阐明如何使用Q对象,给定搜索“Firstname Lastname”,上一个查询等于:

Entity.objects.filter(
    Q(first_name__istartswith="Firstname") | Q(last_name__istartswith="Firstname") |
    Q(first_name__istartswith="Lastname") | Q(last_name__istartswith="Lastname")
    )

ct2axkht

ct2axkht3#

这是一个相当古老的问题,但我刚刚遇到了同样的问题,我想我会分享一个更优雅的解决方案。

from django.db.models import Value as V
from django.db.models.functions import Concat

from ..models import User

def find_user_by_name(search_str) -> QuerySey[User]:
    q = User.objects.annotate(full_name=Concat('first_name', V(' '), 'last_name'))
    q = q.filter(full_name__icontains=search_str)
    return q

字符串
这是唯一的解决方案,我已经发现,让给我想要的行为,IE搜索与一个完整的名称字符串与一个空格(“John Doe”)和一个部分字符串(“John Do”).

jexiocij

jexiocij4#

类似问题:Querying full name in Django

query = request.GET.get('query')
entities = []

try:
    firstname = query.split(' ')[0]
    lastname  = query.split(' ')[1]
    entities += Entity.objects.filter(firstname__icontains=firstname,lastname__icontains=lastname)
    entities += Entity.objects.filter(firstname__icontains=lastname,lastname__icontains=firstname)

entities = set(entities)

字符串

相关问题