Django
JSONField - un campo específico de PostgreSQL
Buscar..
Sintaxis
- JSONField (** opciones)
Observaciones
El
JSONField
de Django realmente almacena los datos en una columnaJSONB
Postgres, que solo está disponible en Postgres 9.4 y posteriores.JSONField
es genial cuando quieres un esquema más flexible. Por ejemplo, si desea cambiar las claves sin tener que realizar ninguna migración de datos, o si no todos sus objetos tienen la misma estructura.Si está almacenando datos con claves estáticas, considere usar varios campos normales en lugar de
JSONField
s, ya que la consulta aJSONField
puede ser bastante tediosa a veces.
Encadenar consultas
Puedes encadenar consultas juntas. Por ejemplo, si un diccionario existe dentro de una lista, agregue dos guiones bajos y su consulta de diccionario.
No te olvides de separar las consultas con guiones bajos.
Creando un campo JSON
Disponible en Django 1.9+
from django.contrib.postgres.fields import JSONField
from django.db import models
class IceCream(models.Model):
metadata = JSONField()
Puede agregar las **options
normales **options
si lo desea.
! Tenga en cuenta que debe poner
'django.contrib.postgres'
enINSTALLED_APPS
en susettings.py
Creando un objeto con datos en un campo JSON
Pase datos en forma nativa de Python, por ejemplo, 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'],
})
Consulte la nota en la sección "Comentarios" sobre el uso de
JSONField
en la práctica.
Consulta de datos de nivel superior.
IceCream.objects.filter(metadata__ordered_by='Guido Van Rossum')
Consulta de datos anidados en diccionarios.
Obtenga todos los conos de helado que fueron ordenados por personas que les gusta el chocolate:
IceCream.objects.filter(metadata__buyer__favorite_flavor='chocolate')
Consulte la nota en la sección "Comentarios" sobre el encadenamiento de consultas.
Consulta de datos presentes en matrices
Un entero se interpretará como una búsqueda de índice.
IceCream.objects.filter(metadata__buyer__known_for__0='creating stack overflow')
Consulte la nota en la sección "Comentarios" sobre el encadenamiento de consultas.
Ordenar por valores JSONField
El pedido directamente en JSONField
todavía no se admite en Django. Pero es posible a través de RawSQL usando las funciones PostgreSQL para jsonb:
from django.db.models.expressions import RawSQL
RatebookDataEntry.objects.all().order_by(RawSQL("data->>%s", ("json_objects_key",)))
Este ejemplo ordena por data['json_objects_key']
dentro de JSONField
nombre de data
:
data = JSONField()