2010-09-09 1 views
1

Я хотел бы выяснить, как выполнить запрос на основе состава столбцов, например полного имени пользователя, без какого-либо пользовательского SQL. Это возможно?Запрос на основе состава столбцов в Django

Представьте себе что-то вроде User.objects.filter (firstname__concat__lastname__startswith = «Barack Обь»)

Я знаю, что в этом конкретном примере, было бы достаточно легко расколоть «Бараку Обь» на whitspace и изменить запрос, но можно ли сделать запрос о составе столбцов, подобных этому?

ответ

1

Возможное решение вашего вопроса может быть выполнено, если ваша база данных поддерживает полнотекстовый поиск. Я использую Postgresql (see documentation) и был в состоянии сделать следующую работу запроса:

print User.objects.all().extra(where = 
    ["to_tsvector(coalesce(first_name) || coalesce(last_name)) 
     @@ to_tsquery('BarackObama')"]) 

Вы обратите внимание, что я использовал полное имя в запросе. Мои знания текстового поиска ограничены, и я не знаю, есть ли способ сделать эквивалент __startswith (реализован с использованием LIKE).

Я подозреваю, что это будет излишним для ваших нужд. Возможно, вам лучше добавить настраиваемое поле или настраиваемый метод или комбинацию из двух, чтобы реализовать это.

+0

Пользовательское поле для каждой комбинации столбцов, которые я хочу, будет очень плохо для памяти. Пользовательский метод означает, что фильтрация выполняется на стороне python, а не на РСУБД. –

1

С текущим Django ORM нет, его не существует. У вас есть доступ к обработчику запросов объекта Q.

User.objects.filter(Q(firstname__startswith=name.split(" ", 1)[0]), Q(lastname__startswith=name.split(" ", 1)[1])) 
+1

Я мог бы сделать этот же запрос с объектом Q. –

Смежные вопросы