Ricerca…


Sintassi

  • JSONField (** opzioni)

Osservazioni

  • Django's JSONField memorizza i dati in una colonna Postgres JSONB , 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 di JSONField , poiché JSONField interrogazione su JSONField 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' in INSTALLED_APPS nel vostro settings.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()


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow