sql >> Database >  >> RDS >> PostgreSQL

Django annoteert telling in JSONField met Postgres

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.




  1. Attribuut nummer 10 overschrijdt aantal kolommen 0

  2. Stamboom/stamboomkaart uit database

  3. Hoe kan ik een optionele JOIN doen met SQL?

  4. Krijg topresultaten voor elke groep (in Oracle)