Szukaj…


Składnia

  • JSONField (** opcje)

Uwagi

  • JSONField Django faktycznie przechowuje dane w kolumnie JSONB Postgres, która jest dostępna tylko w Postgres 9.4 i nowszych.

  • JSONField jest świetny, gdy potrzebujesz bardziej elastycznego schematu. Na przykład, jeśli chcesz zmienić klucze bez konieczności wykonywania migracji danych lub jeśli nie wszystkie obiekty mają tę samą strukturę.

  • Jeśli przechowujesz dane za pomocą kluczy statycznych, rozważ użycie wielu normalnych pól zamiast JSONField , ponieważ zapytania JSONField mogą JSONField być dość uciążliwe.

Łączenie zapytań

Możesz łączyć zapytania razem. Na przykład, jeśli słownik istnieje na liście, dodaj dwa podkreślenia i zapytanie do słownika.

Nie zapomnij oddzielić zapytań podwójnymi podkreśleniami.

Tworzenie JSONField

Dostępne w Django 1.9+

from django.contrib.postgres.fields import JSONField
from django.db import models

class IceCream(models.Model):
    metadata = JSONField()

Możesz dodać normalne **options jeśli chcesz.

! Pamiętaj, że musisz umieścić 'django.contrib.postgres' w INSTALLED_APPS w 'django.contrib.postgres' settings.py

Tworzenie obiektu z danymi w JSONField

Przekaż dane w natywnej formie Python, na przykład list , dict , str , None , bool itp.

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'],
})

Zobacz uwagę w sekcji „Uwagi” na temat JSONField korzystania z JSONField .

Zapytanie o dane najwyższego poziomu

IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')

Zapytanie o dane zagnieżdżone w słownikach

Zdobądź wszystkie lody, które zostały zamówione przez osoby lubiące czekoladę:

IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')

Zobacz notatkę w sekcji „Uwagi” na temat tworzenia łańcuchów zapytań.

Zapytanie o dane obecne w tablicach

Liczba całkowita będzie interpretowana jako wyszukiwanie indeksu.

IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')

Zobacz notatkę w sekcji „Uwagi” na temat tworzenia łańcuchów zapytań.

Porządkowanie według wartości JSONField

Zamawianie bezpośrednio na JSONField nie jest jeszcze obsługiwane w Django. Ale jest to możliwe poprzez RawSQL przy użyciu funkcji PostgreSQL dla jsonb:

from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))

W tym przykładzie data['json_objects_key'] według data['json_objects_key'] wewnątrz data nazwie JSONField :

data = JSONField()


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow