Агрегация 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()), но безуспешно.
Есть идеи?