У меня была похожая проблема, и я искал решение.Полагая, что поисковая система будет лучшим вариантом (например, django-haystack
с Elasticsearch
), вот как я реализовал бы некоторый код для ваших нужд, используя только Django ORM (вы можете заменить icontains
на istartswith
):
from django.db.models import Value
from django.db.models.functions import Concat
queryset = User.objects.annotate(full_name=Concat('first_name', Value(' '), 'last_name')
return queryset.filter(full_name__icontains=value)
В моем случае я не знал, вставит ли пользователь 'first_name
last_name
' или наоборот, поэтому я использовал следующий код.
from django.db.models import Q, Value
from django.db.models.functions import Concat
queryset = User.objects.annotate(first_last=Concat('first_name', Value(' '), 'last_name'), last_first=Concat('last_name', Value(' '), 'first_name'))
return queryset.filter(Q(first_last__icontains=value) | Q(last_first__icontains=value))
При Django <1.8 вам, вероятно, придется прибегнуть к <code>extra с функцией SQL CONCAT
, что-то вроде следующего:
queryset.extra(where=['UPPER(CONCAT("auth_user"."last_name", \' \', "auth_user"."first_name")) LIKE UPPER(%s) OR UPPER(CONCAT("auth_user"."first_name", \' \', "auth_user"."last_name")) LIKE UPPER(%s)'], params=['%'+value+'%', '%'+value+'%'])