Sök…


Syntax

  • JSONField (** optioner)

Anmärkningar

  • Djangos JSONField lagrar faktiskt uppgifterna i en Postgres JSONB 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 om JSONField 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' i INSTALLED_APPS i dina settings.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änder JSONField 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()


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow