Recherche…


Syntaxe

  • JSONField (options **)

Remarques

  • JSONField de Django JSONField fait les données dans une colonne JSONB 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 interroger JSONField peut parfois JSONField 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' dans INSTALLED_APPS dans vos settings.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()


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow