Django
JSONField - pole specyficzne dla PostgreSQL
Szukaj…
Składnia
- JSONField (** opcje)
Uwagi
JSONField
Django faktycznie przechowuje dane w kolumnieJSONB
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ż zapytaniaJSONField
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'
wINSTALLED_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 zJSONField
.
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()