PostgreSQL 9.2 tiene soporte de tipo de datos json nativo. ¿Cómo creo un modelo django que pueda usar este tipo de datos como uno de los campos modelo?¿Cómo uso el tipo de datos PostgreSQL 9.2 JSON en Django?
Respuesta
[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:
- 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)
- usted actualmente sobre todo ganar solo la validación json del lado de la base de datos
- 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.
- 1. Cómo indexar datos JSON en PostgreSQL 9.2?
- 2. Límite de tamaño del tipo de datos JSON en PostgreSQL
- 3. Uso de datos JSON
- 4. Uso de JSON en la plantilla django
- 5. Cómo asignar el campo de matriz PostgreSQL en Django ORM
- 6. ¿Cuáles son los casos de uso adecuados para el tipo de datos de matriz PostgreSQL?
- 7. Salida JSON en Postgresql
- 8. ¿Cómo uso las horas GMT en postgresql?
- 9. ¿Cómo copiar la base de datos en uso a otra base de datos en django?
- 10. Uso forms.TextArea para el campo JSON personalizada en el sitio de administración de Django
- 11. Tamaño máximo del tipo de datos "TEXTO" en postgresql
- 12. ¿qué es equivalente al tipo de datos largos en postgresql?
- 13. Django queryset a dict para su uso en JSON
- 14. ¿Cómo alterar el tipo de datos de una columna en una tabla de PostgreSQL?
- 15. PostgreSQL para Django en Elastic Beanstalk
- 16. Django + PostgreSQL: ¿Cómo restablecer la clave principal?
- 17. Django JSON Deserialización Seguridad
- 18. Uso de datos JSON en D3 Visualización de Javascript
- 19. tipos de datos múltiples matriz en PostgreSQL
- 20. Datos espaciales en PostgreSQL
- 21. ¿Cómo uso el MultiWidget de Django?
- 22. ¿Cómo cerrar conexiones inactivas en PostgreSQL automáticamente?
- 23. Postgresql en minúsculas para comparar datos
- 24. ¿Cómo uso CommaSeparatedIntegerField en django?
- 25. ¿Cómo tomar un elemento aleatorio de una base de datos en Django/postgreSQL?
- 26. "ORDER BY ... El uso de" cláusula en PostgreSQL
- 27. ¿Bibliotecas Javascript que permiten consultas tipo SQL en datos JSON?
- 28. ¿Cómo verificar si existe algo en una base de datos postgresql usando django?
- 29. cómo obtener el tamaño y el tipo de columna a través de mi base de datos en PostgreSQL
- 30. ¿Cuál es el tipo de datos para una contraseña en PostgreSQL?
¿No puede indexar en los campos dentro del tipo json? –
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
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