Django
JSONField - ett PostgreSQL-specifikt fält
Sök…
Syntax
- JSONField (** optioner)
Anmärkningar
Djangos
JSONField
lagrar faktiskt uppgifterna i en PostgresJSONB
kolumn, som endast är tillgänglig i Postgres 9.4 och senare.JSONField
är bra när du vill ha ett mer flexibelt schema. Till exempel om du vill ändra nycklarna utan att behöva göra någon datamigrering, eller om inte alla dina objekt har samma struktur.Om du lagrar data med statiska nycklar, kan du överväga att använda flera normala fält istället för
JSONField
istället, eftersom fråga omJSONField
kan bli ganska tråkigt ibland.
Kedja frågor
Du kan kedja frågor tillsammans. Till exempel, om en ordlista finns i en lista, lägg till två understreck och din ordboksfråga.
Glöm inte att separera frågor med dubbla understreck.
Skapa ett JSONField
Finns i Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
Du kan lägga till de vanliga **options
om du vill.
! Observera att du måste lägga
'django.contrib.postgres'
iINSTALLED_APPS
i dinasettings.py
Skapa ett objekt med data i ett JSONField
Skicka data i naturlig Python-form, till exempel list
, dict
, str
, None
, bool
, etc.
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'],
})
Se anteckningen i avsnittet "Anmärkningar" om
JSONField
använderJSONField
i praktiken.
Fråga information på toppnivå
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
Förfrågningsdata kapslade i ordböcker
Få alla glass kottar som beställdes av människor som gillar choklad:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
Se anteckningen i avsnittet "Kommentarer" om kedjeförfrågningar.
Förfrågningsdata som finns i matriser
Ett heltal tolkas som ett indexuppslag.
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
Se anteckningen i avsnittet "Kommentarer" om kedjeförfrågningar.
Beställning enligt JSONField-värden
Beställning direkt på JSONField
inte ännu i Django. Men det är möjligt via RawSQL med hjälp av PostgreSQL-funktioner för jsonb:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Detta exempel beställer efter data['json_objects_key']
inuti JSONField
namngivna data
:
data = JSONField()