Який еквівалент цього оператора 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%
НЕ був би.
містить і значки, згадані фальцетру, роблять такі запити 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-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
result = table.objects.filter(string__icontains='pattern')