U kunt jsonb_extract_path_text gebruiken via een Func object als alternatief voor de veldtransformatie:
Pet.annotate(dinner=Func(
F('data'), Value('diet'), Value('dinner'),
function='jsonb_extract_path_text')) \
.values('dinner') \
.annotate(total=Count('dinner'))
De reden waarom het veld data__diet__dinner
transformeert mislukt is een fout binnen Django wanneer je dieper gaat dan slechts één niveau in de json-structuur en gebruik GROUP BY
in de Sql. Het eerste niveau (name
, animal
, diet
) zou goed moeten werken.
De reden lijkt te zijn dat Django voor geneste transformaties de gebruikte SQL-syntaxis verandert, waarbij hij overschakelt van een enkele waarde naar een lijst om het pad naar de json-structuur te specificeren.
Dit is de syntaxis die wordt gebruikt voor niet-geneste json-transformaties (=eerste niveau):
"appname_pet"."data" -> 'diet'
En dit is de syntaxis die wordt gebruikt voor geneste transformaties (dieper dan het eerste niveau):
"appname_pet"."data" #> ARRAY['diet', 'dinner']
Tijdens het samenstellen van de query verslikt Django zich in die lijst terwijl hij de vereiste GROUP BY
uitwerkt clausules. Dit lijkt geen onvermijdelijke beperking; de ondersteuning voor transformaties is vrij nieuw, en dit is mogelijk een van de knelpunten die nog niet zijn uitgewerkt. Dus als je een Django-ticket
opent , dit zou een paar versies later kunnen werken.