PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Conteggio delle annotazioni di Django in JSONField con Postgres

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.