Django
JSONField - een PostgreSQL-specifiek veld
Zoeken…
Syntaxis
- JSONField (** opties)
Opmerkingen
Het
JSONField
Django slaat de gegevens op in eenJSONB
kolom van Postgres, die alleen beschikbaar is in Postgres 9.4 en hoger.JSONField
is geweldig als u een flexibeler schema wilt. Als u bijvoorbeeld de sleutels wilt wijzigen zonder datamigraties uit te voeren, of als niet al uw objecten dezelfde structuur hebben.Als u gegevens met statische sleutels
JSONField
kunt u in plaats daarvan meerdere normale velden gebruiken in plaats vanJSONField
, omdat het opvragen vanJSONField
soms behoorlijk vervelend kan zijn.
Query's koppelen
U kunt zoekopdrachten samenvoegen. Als er bijvoorbeeld een woordenboek in een lijst bestaat, voegt u twee onderstrepingstekens en uw woordenboekquery toe.
Vergeet niet om vragen te scheiden met dubbele onderstrepingstekens.
Een JSON-veld maken
Beschikbaar in Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
U kunt desgewenst de normale **options
toevoegen.
! Merk op dat je
'django.contrib.postgres'
inINSTALLED_APPS
in jesettings.py
moet zetten
Een object met gegevens maken in een JSONField
Geef gegevens door in native Python-vorm, bijvoorbeeld list
, dict
, str
, None
, bool
, etc.
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'],
})
Zie de opmerking in de sectie "Opmerkingen" over het gebruik van
JSONField
in de praktijk.
Gegevens op het hoogste niveau opvragen
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
Gegevens opvragen die zijn genest in woordenboeken
Koop alle ijshoorntjes die werden besteld door mensen die van chocolade houden:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
Zie de opmerking in het gedeelte 'Opmerkingen' over het koppelen van zoekopdrachten.
Gegevens opvragen in arrays
Een geheel getal wordt geïnterpreteerd als een indexopzoekactie.
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
Zie de opmerking in het gedeelte 'Opmerkingen' over het koppelen van zoekopdrachten.
Bestellen op JSONField-waarden
Direct bestellen op JSONField
wordt nog niet ondersteund in Django. Maar het is mogelijk via RawSQL met behulp van PostgreSQL-functies voor jsonb:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Dit voorbeeld data['json_objects_key']
op data['json_objects_key']
in JSONField
naam data
:
data = JSONField()