Запрос полного имени в Django

Как я могу запросить полное имя в Django?

Чтобы пояснить, я действительно хочу создать временный столбец, объединив first_name и last_name, чтобы дать полное имя, затем сделайте LIKE, например:

select [fields] from Users where CONCAT(first_name, ' ', last_name) LIKE '%John Smith%";

В приведенном выше запросе будут возвращены все пользователи с именем John Smith. Если возможно, я бы хотел избежать использования SQL-запроса.

Модель, о которой я говорю конкретно, - это модель пользователя django.contrib.auth.models. Внесение изменений в модель напрямую не является проблемой.

Например, если пользователь должен был искать "John Paul Smith", он должен соответствовать пользователям с именем "John Paul" и фамилией "Smith", а также пользователями с именем "John" и фамилия "Пол Смит".

Ответы

Ответ 1

Если я что-то не хватает, вы можете использовать python для запроса вашей БД следующим образом:

from django.contrib.auth.models import User
x = User.objects.filter(first_name='John', last_name='Smith') 

Edit: Чтобы ответить на ваш вопрос:

Если вам нужно вернуть "John Paul Smith", когда пользователь ищет "John Smith", вы можете использовать " contains ' который переводится в SQL LIKE. Если вам просто нужна память для хранения имени" Джон Пол", поместите оба имени в столбец first_name.

User.objects.filter(first_name__contains='John', last_name__contains='Smith') 

Это означает:

SELECT * FROM USERS
WHERE first_name LIKE'%John%' 
AND last_name LIKE'%Smith%'

Ответ 2

проще:

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

Где query_name может быть "John Smith" (но также будет извлекать пользователя Smith John, если таковой имеется).

Ответ 3

class User( models.Model ):
    first_name = models.CharField( max_length=64 )
    last_name = models.CharField( max_length=64 )
    full_name = models.CharField( max_length=128 )
    def save( self, *args, **kw ):
        self.full_name = '{0} {1}'.format( first_name, last_name )
        super( User, self ).save( *args, **kw )

Ответ 4

Как насчет этого:

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

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

users = set(users)

Пробовал и тестировал!