Django
JSONField - un champ spécifique à PostgreSQL
Recherche…
Syntaxe
- JSONField (options **)
Remarques
JSONField
de DjangoJSONField
fait les données dans une colonneJSONB
Postgres, uniquement disponible dans Postgres 9.4 et versions ultérieures.JSONField
est idéal lorsque vous souhaitez un schéma plus flexible. Par exemple, si vous souhaitez modifier les clés sans effectuer de migration de données ou si tous vos objets n'ont pas la même structure.Si vous stockez des données avec des clés statiques, envisagez d'utiliser plusieurs champs normaux au lieu de
JSONField
s, car interrogerJSONField
peut parfoisJSONField
assez fastidieux.
Enchaînement des requêtes
Vous pouvez enchaîner les requêtes ensemble. Par exemple, si un dictionnaire existe dans une liste, ajoutez deux traits de soulignement et votre requête de dictionnaire.
N'oubliez pas de séparer les requêtes avec des traits de soulignement doubles.
Créer un JSONField
Disponible dans Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
Vous pouvez ajouter les **options
normales si vous le souhaitez.
! Notez que vous devez mettre
'django.contrib.postgres'
dansINSTALLED_APPS
dans vossettings.py
Création d'un objet avec des données dans un JSONField
Passer des données sous forme Python native, par exemple 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'],
})
Voir la note dans la section "Remarques" sur l'utilisation de
JSONField
dans la pratique.
Interrogation des données de niveau supérieur
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
Interrogation de données imbriquées dans des dictionnaires
Obtenez tous les cornets de glace qui ont été commandés par des gens qui aiment le chocolat:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
Voir la remarque dans la section "Remarques" sur le chaînage des requêtes.
Interrogation des données présentes dans les tableaux
Un entier sera interprété comme une recherche d'index.
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
Voir la remarque dans la section "Remarques" sur le chaînage des requêtes.
Classement par valeurs JSONField
La commande directement sur JSONField
n'est pas encore prise en charge dans Django. Mais c'est possible via RawSQL en utilisant les fonctions PostgreSQL pour jsonb:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Cet exemple commande par data['json_objects_key']
dans les data
nommées JSONField
:
data = JSONField()