К сожалению, ORM Django не имеет ничего встроенного для обратных LIKE. Но предложение .extra()
может сделать его немного легче, чем сырой запрос.
я использовал что-то вроде этого:
qs.extra(
where=['''%s LIKE %s.%s'''],
params=(
"string to match",
FooModel._meta.db_table,
"bar_field",
),
)
Проблемы с кодом выше, что
1) он не работает с SQLite бэкэнда в таком виде («синтаксическая ошибка рядом», он работает с именами таблиц/столбцов, жестко закодированными в запросе ... что не всегда безопасно и всегда уродливо);
и 2) он требует FooModel.bar_field иметь данные %in like style%
, так что вы не можете соответствовать произвольные строки (это может быть исправлено с помощью запроса, как %s LIKE CONCAT("%", %s.%s, "%")
, но это будет сделать это СУБД конкретного, что не очень хорошо).
Обратный LIKE сам должен, вероятно, работать с любой основной СУБД, но я тестировал его только на sqlite и postgres.
Может кто-то должен обобщить мое решение и создать повторно, СУБД агностик приложение со специальным подклассы QuerySet/менеджер/Q-объекта для этой конкретной задачи ...
Он будет генерировать обычный запрос 'LIKE', а не обратный. –