Django
JSONField - un campo specifico PostgreSQL
Ricerca…
Sintassi
- JSONField (** opzioni)
Osservazioni
Django's
JSONFieldmemorizza 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
JSONFielddiJSONField, poichéJSONFieldinterrogazione suJSONFieldpuò 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_APPSnel 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
JSONFieldin 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()