Как воспроизвести ILIKE в Django

В Django как ILIKE работают 2 лукапа - 'iexact' и 'icontains'. Первый создает запросы вида ILIKE 'my query', а второй ILIKE '%my query%'.

Вопрос - как с помощью Django ORM сделать запрос ILIKE '%my%query%'?


Ответы (1 шт):

Автор решения: Roman Konoval

Встроенной возможности нет, но можно определить пользовательский lookup:

from django.db.models import Lookup
from django.db.models.fields import Field

@Field.register_lookup
class ILikeLookup(Lookup):
    lookup_name = 'ilike'

    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 ILIKE %s' % (lhs, rhs), params

После этого его можно использовать так:

MyModel.objects.filter(somefield__ilike='%my%query%')
→ Ссылка