Django QuerySet: фильтр по «столбцу значения LIKE» - PullRequest
0 голосов
/ 20 мая 2019

У меня есть запрос SQL, чтобы определить самый длинный совпадающий префикс, соответствующий данной входной строке. Вариант использования - найти скорость вызова для данного пункта назначения, которая определяется несколькими строками в базе данных. Наиболее конкретный префикс соответствия - тот, который нужно использовать.

Так что в сыром SQL это выглядит так:

SELECT * FROM rateplan_rates
WHERE '3212345789' LIKE CONCAT(prefix, '%')
ORDER BY CHAR_LENGTH(prefix) DESC LIMIT 1

В приведенном выше примере назначение - 3212345789. В реальном приложении это поддерживается механизмами кеширования и многим другим, но все сводится к этому.

Я хочу сделать то же самое в нашем проекте Django для вызова API, и я знаю, что я тоже могу использовать сырой SQL, но мне было интересно, есть ли способ сделать в Django "queryset-language" .

Я застрял с этим:

RateplanRate.objects \
    .annotate(prefix_length=Length('prefix'), prefix_match=Concat('prefix', '%')) \
    .filter('search_value LIKE prefix_match') \
    .order_by('-prefix_length')[0:1]

Недостающая часть - это, конечно, search_value LIKE prefix_match. Это возможно, или я должен просто вернуться к сырому SQL?

1 Ответ

1 голос
/ 20 мая 2019

Я думаю, вы ищете что-то вроде icontains или contains

1009 * Е.Г. *

RateplanRate.objects.filter(field__icontains='foobar')
...