Использование 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. Однако, после многих часов работы,

  1. Я не могу правильно передать правильный параметр 's.answers' из другой таблицы.
  2. Я не понимаю, как получить обе таблицы в результате

Сгенерированный запрос ниже просто получает синтаксическую ошибку для параметра функции.

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"
Вернуться на верх