Django
JSONField - pole specyficzne dla PostgreSQL
Szukaj…
Składnia
- JSONField (** opcje)
Uwagi
JSONFieldDjango faktycznie przechowuje dane w kolumnieJSONBPostgres, która jest dostępna tylko w Postgres 9.4 i nowszych.JSONFieldjest ś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ż zapytaniaJSONFieldmogąJSONFieldbyć 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_APPSw'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
JSONFieldkorzystania 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()