uso tipo postgres jsonfield example ejemplo dato contrib arrayagg json django postgresql

jsonfield - tipo de dato json en postgresql



¿Cómo uso el tipo de datos PostgreSQL 9.2 JSON en Django? (2)

A partir de Django 1.9, JSONField está disponible en el módulo django.contrib.postgres.fields que se envía con Django. Este campo utiliza el tipo de campo PostgreSQL jsonb (no json).

PostgreSQL 9.2 tiene soporte nativo de tipo de datos json. ¿Cómo creo un modelo de django que pueda usar este tipo de datos como uno de los campos del modelo?


[Nótese bien. Muchas cosas sucedieron desde que se publicó la pregunta, así que pensé en actualizar la respuesta también, ahora incluye la nueva información de Django-postgresql y PostgreSQL 9.3]

PostgreSQL 9.3

El soporte JSON en PostgreSQL (ver el doc está volviendo más y más interesante. ¡Ahora es posible buscar en los campos JSON como si fueran columnas de base de datos! Este soporte aún es básico y no está a la par con los operadores de columna estándar (ver antes), como será fácil de usar a través de Django ORM.

PostgreSQL 9.2

El tipo de datos JSON es básicamente texto en pgSQL 9.2. Lo que se agrega es la validación JSON: es útil, pero no para girar la cabeza.

** Django y PostgreSQL JSON

Un reciente desarrollo respaldado por Kickstarted para soporte avanzado de PostgreSQL en Django fue financiado hace unos meses. Incluirá soporte avanzado para el tipo JSON, pero probablemente solo en 9.4:

El equipo de Postgres ha fusionado recientemente el soporte para un tipo de datos jsonb: JSON almacenado en binario. Es muy probable que retrase el soporte JSON hasta que Postgres 9.4 esté fuera y solo admita el tipo de datos jsonb. Hay varias razones para esto, la más importante es que el tipo de datos json actual está severamente limitado en su implementación, y carece incluso de un operador de igualdad. Esto significa que algunas partes del código de anotación Django generan consultas no válidas (ver este informe) y también significa que una búsqueda __exact debe estar prohibida. Para manejar adecuadamente todos estos casos de borde en Django, esto resultaría en una gran cantidad de complejidad, y los beneficios que obtienes con solo almacenar json en un campo de texto son bastante limitados. 9.4 está previsto para finales de este año, por lo que es probable que los campos JSON solo aparezcan en la versión 1.8.

Fuente: blog mjtamlyn

Psycopg ahora también admite de forma nativa el campo JSON (así como HSTORE).

** DIY en Django **

En django es bastante fácil crear su propio campo de modelo que usa un tipo de base de datos especial, vea el campo db_type () .

Por favor informa eso:

  1. esto solo funcionaría bajo pgSQL; está limitando la portabilidad de su código (aunque puede devolver condicionalmente un tipo de ''texto'' en otras bases de datos)
  2. actualmente solo obtendrás la validación json del lado de la base de datos
  3. ¡Y por supuesto el placer de recuperar directamente un objeto JSON!

Pero tenga cuidado de que Python no tenga / direct / support para JSON, así que realmente no está saltando el costo de volcado / carga de json en python; Evita la conversión de cadenas, pero no he revisado las partes internas ni he evaluado para ver si hay alguna diferencia real.

Con PostgreSQL 9.3 y las siguientes apariencias, las cosas podrían volverse más interesantes.

También puede comenzar desde el django JSONField y obtener una gran cantidad de placas de boilercode, simplemente anule el método db_type .

Lo que suena, en mi opinión, es más interesante y vale la pena un bloqueo de la base de datos (¡me encanta pgSql, en cualquier caso!), Es la opción en pgSQL para retunir datos como una estructura JSON utilizando array_to_json y row_to_json . Sin embargo, esto requeriría un cambio más serio en los conjuntos de consultas, lo que parece fuera del alcance de su pregunta.