Запрос полного имени в 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)
Пробовал и тестировал!