Django
JSONField - ein PostgreSQL-spezifisches Feld
Suche…
Syntax
- JSONField (** Optionen)
Bemerkungen
Django's
JSONField
speichert die Daten tatsächlich in einer Postgres-JSONB
Spalte, die nur in Postgres 9.4 und höher verfügbar ist.JSONField
istJSONField
wenn Sie ein flexibleres Schema wünschen. Zum Beispiel, wenn Sie die Schlüssel ändern möchten, ohne Datenmigrationen durchführen zu müssen, oder wenn nicht alle Ihre Objekte die gleiche Struktur haben.Wenn Sie Daten mit statischen Schlüsseln speichern, sollten Sie stattdessen mehrere normale Felder anstelle von
JSONField
verwenden, da die Abfrage vonJSONField
manchmal recht langwierig wird.
Verkettung von Anfragen
Sie können Abfragen miteinander verketten. Wenn beispielsweise ein Wörterbuch in einer Liste vorhanden ist, fügen Sie zwei Unterstriche und Ihre Wörterbuchabfrage hinzu.
Vergessen Sie nicht, Abfragen mit doppelten Unterstrichen zu trennen.
JSONField erstellen
Verfügbar in Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
Sie können die normalen **options
hinzufügen **options
wenn Sie möchten.
! Beachten Sie, dass Sie
'django.contrib.postgres'
inINSTALLED_APPS
in Ihresettings.py
INSTALLED_APPS
müssen
Ein Objekt mit Daten in einem JSONField erstellen
Übergeben Sie Daten in nativem Python-Format, z. B. list
, dict
, str
, None
, bool
usw.
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'],
})
Beachten Sie den Hinweis im Abschnitt "Anmerkungen" zur Verwendung von
JSONField
in der Praxis.
Daten der obersten Ebene abfragen
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
Abfragen von in Wörterbüchern geschachtelten Daten
Holen Sie sich alle Eistüten, die von Leuten bestellt wurden, die Schokolade mögen:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
Beachten Sie den Hinweis im Abschnitt "Anmerkungen" zum Verketten von Abfragen.
Abfragen von Daten in Arrays
Eine Ganzzahl wird als Indexsuche interpretiert.
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
Beachten Sie den Hinweis im Abschnitt "Anmerkungen" zum Verketten von Abfragen.
Bestellung nach JSONField-Werten
Die direkte Bestellung über JSONField
wird in Django noch nicht unterstützt. Es ist aber über RawSQL mit PostgreSQL-Funktionen für jsonb möglich:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Dieses Beispiel ordnet nach data['json_objects_key']
in JSONField
namens data
:
data = JSONField()