2012-09-13 9 views

Respuesta

29

[Nb. Mucho ha pasado desde que la cuestión se publicó, así que pensé que la actualización de la respuesta también - que ahora incluye nuevo Django-PostgreSQL y PostgreSQL 9.3 Información]

PostgreSQL 9,3

apoyo JSON en PostgreSQL (ver el doc es cada vez más y más interesante. ¡Ahora es posible buscar en los campos JSON como si fueran columnas de bases de datos! Este soporte sigue siendo básico y no está a la par con los operadores de columnas estándar (ver antes), por lo tanto será filo de usar a través de Django ORM

PostgreSQL 9.2

El tipo de datos JSON es basically text en pgSQL 9.2. Lo que se agrega es la validación de JSON: útil, pero sin dar vuelta la cabeza.

** Django y PostgreSQL JSON

Un reciente Kickstarted backed development de soporte para PostgreSQL avanzada 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 binario almacenado. Es bastante probable que demore el soporte de JSON hasta que Postgres 9.4 finalice 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, careciendo incluso de un operador de igualdad. Esto significa que algunas partes del código de anotación de Django generan consultas no válidas (ver este informe) y también significa que una búsqueda __exact tiene que estar prohibida. Manejar todos estos casos de borde correctamente en Django resultaría en una gran cantidad de complejidad, y los beneficios que obtienes por el solo hecho de almacenar json en un campo de texto son bastante limitados. 9.4 saldrá a finales de este año, por lo que, como resultado, es probable que los campos JSON solo aparezcan en la versión 1.8.

Fuente: mjtamlyn blog

Psycopg también ahora soporta de forma nativa la JSON field (así como hstore).

** ** bricolaje en Django

En Django es bastante fácil de crear su propio campo del modelo que utiliza un tipo especial de base de datos, ver field db_type().

Tenga en cuenta que:

  1. esto sólo funcionaría bajo pgSQL - que está limitando su portabilidad del código (aunque condicionalmente puede devolver un tipo de 'texto' en otras bases de datos)
  2. usted actualmente sobre todo ganar solo 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/directo/soporte para JSON, por lo que no se está salteando el costo de volcado/carga json en python; evitas la conversión de cadenas, pero no he revisado las partes internas o las pruebas comparativas para ver si hay alguna diferencia real.

con PostgreSQL 9.3 y siguientes parece que las cosas podrían ser más interesante

También podría comenzar desde el django JSONField y obtener una gran cantidad de placa boilercode ya, basta con reemplazar el método db_type.

Lo que suena, en mi opinión, más interesante y vale la pena un lock-in de base de datos (¡me encanta pgSql, en cualquier caso!), Es la opción en pgSQL para restaurar datos como una estructura JSON usando array_to_json and row_to_json. Esto requeriría un cambio más serio en los conjuntos de consulta, lo que suena fuera del alcance de su pregunta.

+0

¿No puede indexar en los campos dentro del tipo json? –

+0

El siguiente enlace muestra una opción para permitir la indexación, básicamente cambiarlo de texto al campo de char https://github.com/bradjasper/django-jsonfield#other-fields – stormlifter

+0

Tenía esta misma pregunta, y un par de puntos de datos más: (1) 'django-pgfields' proporciona envoltorios para usar el tipo de datos JSON, pero no acceso nativo a las características de búsqueda JSON de Postgres. (2) kickstarter fue totalmente financiado en febrero de 2014 para implementar el soporte nativo de Django para todos los tipos de datos de Postgres en 'django.contrib.postgres' con una entrega de destino para Django 1.8. El código de publicación pública solo ha progresado a funciones muy básicas: https://www.kickstarter.com/projects/mjtamlyn/improved-postgresql-support-in-django – mirth23

8

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 usa el tipo de campo PostgreSQL jsonb (no json).

Cuestiones relacionadas