sql "LIKE" еквівалент у запиті django


108

Який еквівалент цього оператора SQL у django?

SELECT * FROM table_name WHERE string LIKE pattern;

Як я реалізую це в django? я намагався

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

Але це не вийшло. Як я це втілю?

Відповіді:


200

Використовуйте __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
Ця відповідь є неповною з причин, зазначених вище. Він також повинен містити інформацію у відповіді @ Дмитра.
medley56

34

містить і значки, згадані фальцетру, роблять такі запити 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-like-lookup . Після встановлення його __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.