sql «LIKE» эквивалент в запросе django


110

Что эквивалентно этому оператору SQL в django?

SELECT * FROM table_name WHERE string LIKE pattern;

Как мне реализовать это в django? Я попытался

result = table.objects.filter( pattern in string )

Но это не сработало. Как мне это реализовать?

Ответы:


203

Используйте __containsили __icontains(без учета регистра):

result = table.objects.filter(string__contains='pattern')

Эквивалент SQL:

SELECT ... WHERE string LIKE '%pattern%';

22
А для поиска без учета регистра используйте __icontains ->result = table.objects.filter(string__icontains='pattern')
Hitesh Garg

13
Этот ответ охватывает только часть возможных шаблонов. Он не справился бы с шаблоном вроде %a%b%.
kasperd

@kasperd, попробуйте:result = table.objects.filter(string__contains='a').filter(string__contains='b')
LS

1
@LS Это матч бы baкоторый LIKE %a%b%не был бы.
kasperd

2
Этот ответ неполон по причинам, указанным выше. Он также должен включать информацию из ответа @Dmitry.
medley56

34

содержит и значки, упомянутые falsetru, создают такие запросы, как SELECT ... WHERE headline LIKE '%pattern%

Наряду с ними вам могут понадобиться эти со схожим поведением: startwith , istartswith , endwith , iendswith

изготовление

SELECT ... WHERE headline LIKE 'pattern%

или

SELECT ... WHERE headline LIKE '%pattern


9
result = table.objects.filter(string__icontains='pattern')

Поиск строки в поле без учета регистра.


2
Хороший, но такой же ответ уже был дан почти три года назад.
LS

3

Чтобы сохранить порядок слов, как в инструкции 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-подобный оператор я буду использовать первый вариант.


2

Это можно сделать с помощью пользовательских поисков 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.