Использование SQL-функции в предложении FROM с помощью Django ORM
Мне нужно преобразовать следующий SQL в запрос Django ORM, но я не могу найти способ сделать это. Речь идет об использовании SQL-функции в предложении FROM. В данном случае это функция JSONB, которая помещает пары ключ/значение json-поля в отдельные колонки.
survey.answers - это поле JSONB. Базой данных является postgres.
SELECT s.id, jsonb_each_text.key, jsonb_each_text.value
FROM survey as s, jsonb_each_text(s.answers);
Что я пробовал?
Существует сторонний плагин https://github.com/BezBartek/django-dynamic-from-clause, который пытается решить проблему, так как вы, похоже, не можете генерировать таблицы из функций в ORM. Однако, после многих часов работы,
- Я не могу правильно передать правильный параметр 's.answers' из другой таблицы.
- Я не понимаю, как получить обе таблицы в результате
Сгенерированный запрос ниже просто получает синтаксическую ошибку для параметра функции.
class JsonbEachText(models.Func):
function = 'jsonb_each_text'
template = "%(function)s('%(expressions)s')"
class JsonbTable(DynamicFromClauseBaseModel):
EXPRESSION_CLASS = JsonbEachText
key = models.SlugField(primary_key=True)
value = models.TextField()
survey = models.ForeignKey(
Survey, related_name='answers_json', on_delete=models.DO_NOTHING,
)
result = JsonbTable.objects.fill_expression_with_parameters(
"response__answers")
)
In [18]: print(result.query)
SELECT "_jsonbtable"."key", "_jsonbtable"."value", "_jsonbtable"."survey_id" FROM jsonb_each_text('response_answers') AS "_jsonbtable"