2015-05-05 5 views
1

У меня есть три vaiables first_name, last_name и middle_name.Объект Q в Django Queryset

Для фильтрации результата я делаю

Q(contact__first_name__icontains=query) | 
Q(contact__last_name__icontains=query) | 
Q(contact__middle_name__icontains=query) 

вместо этого я хочу, чтобы иметь возможность искать запрос в конкатенации first_name, last_name и middle_name. Как я могу это сделать с помощью объектов Q?

Возможно ли это?

ответ

0

Сомнительный с Q, но с extra вы можете попробовать:

SQLite3: 
Person.objects.extra(where=["first_name || ' ' || middle_name || ' ' || last_name = " + query]) 

MySQL: 
Person.objects.extra(where=["CONCAT(first_name, ' ', middle_name, ' ', last_name) = " + query]) 

Может не быть переносимым на различных двигателей DB, если вы начинаете использовать сырые SQL-х.

Что касается Q, как указано на сайте Джанго:

Q() объект, как F объект, инкапсулирует выражение SQL в объекте Python, который может быть использован в операциях по базам данных.

Вы скорее можете изменить свой подход следующим образом:

query = 'MyFirstName MyMiddleName MyLastName'.split(" ") 

Q(contact__first_name__icontains=query[0]) & 
Q(contact__last_name__icontains=query[2]) & 
Q(contact__middle_name__icontains=query[1]) 
Смежные вопросы