Агрегация Django по полю JSONB на несколько уровней в глубину

Как сказано в заголовке, я пытаюсь объединить значение в поле JSONB, которое находится на несколько уровней глубже.

Для модели Payment существует поле JSONB Payment.extra_data, которое содержит структуру данных вида:

{
  "invoice": {
    "extra": {
      "net_amount": 100,
      "tax_amount": 16.63,
    }
  }
}

и я пытаюсь найти сумму значений net_amount.

На данный момент я должен сделать:

payment_qs = Payment.objects.annotate(
    net_amount=Func(
        F("invoice"),
        Value("extra"),
        Value("net_amount"),
        function="jsonb_extract_path_text",
        output_field=models.DecimalField(),
    )
)

что, если я затем сделаю payment_qs.values('meta_amount') дальше, даст мне:

<PaymentQueryset [{'net_amount': Decimal('50.0')}]>

Однако, если я попробую агрегировать набор запросов, то получу:

payment_qs.aggregate('net_amount')

ProgrammingError: function sum(text) does not exist
LINE 1: SELECT SUM("net_amount") FROM (SELECT jsonb_extract_path_te...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Я пробовал установить поле вывода payment_qs.aggregate('net_amount', output_field=DecimalField()), но безуспешно.

Есть идеи?

Вернуться на верх