Puoi utilizzare jsonb_extract_path_text tramite una Func oggetto in alternativa alla trasformazione del campo:
Pet.annotate(dinner=Func(
F('data'), Value('diet'), Value('dinner'),
function='jsonb_extract_path_text')) \
.values('dinner') \
.annotate(total=Count('dinner'))
Il motivo per cui il campo trasforma data__diet__dinner
fails è un errore all'interno di Django quando vai più in profondità di un solo livello nella struttura json e usa GROUP BY
nell'SQL. Il primo livello (name
, animal
, diet
) dovrebbe funzionare correttamente.
Il motivo sembra essere che per le trasformazioni nidificate, Django cambia la sintassi SQL utilizzata, passando da un valore singolo a un elenco per specificare il percorso nella struttura json.
Questa è la sintassi utilizzata per le trasformazioni json non annidate (=primo livello):
"appname_pet"."data" -> 'diet'
E questa è la sintassi utilizzata per le trasformazioni nidificate (più profonde del primo livello):
"appname_pet"."data" #> ARRAY['diet', 'dinner']
Durante la costruzione della query, Django si blocca su quell'elenco mentre elabora il GROUP BY
richiesto clausole. Questa non sembra essere una restrizione inevitabile; il supporto per le trasformazioni è piuttosto nuovo e questo è forse uno dei nodi che non sono stati ancora risolti. Quindi, se apri un biglietto Django
, potrebbe funzionare solo con alcune versioni successive.