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 ist JSONField 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 von JSONField 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' in INSTALLED_APPS in Ihre settings.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()


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow