Django
JSONField - un campo specifico PostgreSQL
Ricerca…
Sintassi
- JSONField (** opzioni)
Osservazioni
Django's
JSONField
memorizza i dati in una colonna PostgresJSONB
, che è disponibile solo in Postgres 9.4 e versioni successive.JSONField
è ottimo quando vuoi uno schema più flessibile. Ad esempio se vuoi cambiare le chiavi senza dover effettuare alcuna migrazione dei dati, o se non tutti gli oggetti hanno la stessa struttura.Se stai memorizzando i dati con chiavi statiche, considera l'utilizzo di più campi normali invece di
JSONField
diJSONField
, poichéJSONField
interrogazione suJSONField
può diventare piuttosto noiosa.
Concatenare query
Puoi concatenare le query insieme. Ad esempio, se un dizionario esiste all'interno di un elenco, aggiungere due trattini bassi e la query del dizionario.
Non dimenticare di separare le query con caratteri di sottolineatura doppio.
Creazione di un campo JSON
Disponibile in Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
Puoi aggiungere le normali **options
se lo desideri.
! Si noti che è necessario mettere
'django.contrib.postgres'
inINSTALLED_APPS
nel vostrosettings.py
Creazione di un oggetto con dati in un campo JSON
Passare i dati in formato Python nativo, ad esempio list
, dict
, str
, None
, bool
, ecc.
IceCream.objects.create(metadata={
'date': '1/1/2016',
'ordered by': 'Jon Skeet',
'buyer': {
'favorite flavor': 'vanilla',
'known for': ['his rep on SO', 'writing a book']
},
'special requests': ['hot sauce'],
})
Vedere la nota nella sezione "Note" sull'utilizzo di
JSONField
in pratica.
Interrogazione dei dati di livello superiore
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
Interrogazione dei dati nidificati nei dizionari
Ottieni tutti i coni gelato ordinati dalla gente che ama il cioccolato:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
Vedere la nota nella sezione "Note" sulla concatenazione di query.
Interrogare i dati presenti negli array
Un intero sarà interpretato come una ricerca di indice.
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
Vedere la nota nella sezione "Note" sulla concatenazione di query.
Ordinamento in base ai valori di JSONField
Ordinare direttamente su JSONField
non è ancora supportato in Django. Ma è possibile tramite RawSQL usando le funzioni di PostgreSQL per jsonb:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Questo esempio ordina per data['json_objects_key']
all'interno JSONField
data
nome JSONField
:
data = JSONField()