Что эквивалентно этому оператору SQL в django?
SELECT * FROM table_name WHERE string LIKE pattern;
Как мне реализовать это в django? Я попытался
result = table.objects.filter( pattern in string )
Но это не сработало. Как мне это реализовать?
Что эквивалентно этому оператору SQL в django?
SELECT * FROM table_name WHERE string LIKE pattern;
Как мне реализовать это в django? Я попытался
result = table.objects.filter( pattern in string )
Но это не сработало. Как мне это реализовать?
Ответы:
Используйте __contains
или __icontains
(без учета регистра):
result = table.objects.filter(string__contains='pattern')
Эквивалент SQL:
SELECT ... WHERE string LIKE '%pattern%';
%a%b%
.
result = table.objects.filter(string__contains='a').filter(string__contains='b')
ba
который LIKE %a%b%
не был бы.
содержит и значки, упомянутые falsetru, создают такие запросы, как SELECT ... WHERE headline LIKE '%pattern%
Наряду с ними вам могут понадобиться эти со схожим поведением: startwith , istartswith , endwith , iendswith
изготовление
SELECT ... WHERE headline LIKE 'pattern%
или
SELECT ... WHERE headline LIKE '%pattern
result = table.objects.filter(string__icontains='pattern')
Поиск строки в поле без учета регистра.
Чтобы сохранить порядок слов, как в инструкции sql LIKE '% pattern%', я использую iregex, например:
qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))
Строковые методы неизменны, поэтому ваша переменная шаблона не изменится, и с. * вы будете искать 0 или более вхождений любого символа, кроме разрывных строк.
Используя следующее для перебора слов шаблона:
qs = table.objects
for word in pattern.split(' '):
qs = qs.filter(string__icontains=word)
порядок слов в вашем шаблоне не будет сохранен для некоторых людей, которые могут работать, но в случае попытки имитировать SQL-подобный оператор я буду использовать первый вариант.
Это можно сделать с помощью пользовательских поисков Django . Я сделал поиск в приложении, похожем на Django . После установки его на __like
поиск с %
и _
маски будут включены.
Весь необходимый код в приложении:
from django.db.models import Lookup
from django.db.models.fields import Field
@Field.register_lookup
class Like(Lookup):
lookup_name = 'like'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return '%s LIKE %s' % (lhs, rhs), params
result = table.objects.filter(string__icontains='pattern')