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
Петр Длоуги
источник