Django
JSONField - ein PostgreSQL-spezifisches Feld
Suche…
Syntax
- JSONField (** Optionen)
Bemerkungen
Django's
JSONFieldspeichert die Daten tatsächlich in einer Postgres-JSONBSpalte, die nur in Postgres 9.4 und höher verfügbar ist.JSONFieldistJSONFieldwenn 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
JSONFieldverwenden, da die Abfrage vonJSONFieldmanchmal 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_APPSin Ihresettings.pyINSTALLED_APPSmü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
JSONFieldin 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()