Descarga / carga de Django JSONField

Estoy usando JSONField en algunos de mis modelos de Django y me gustaría migrar estos datos de Oracle a Postgres.

Hasta ahora no he tenido suerte manteniendo intactos estos datos JSON cuando utilizo los comandos dumpdata y loaddata de Django, los datos se transforman en representaciones de cadena del JSON. Todavía tengo que encontrar una buena solución a esto ... ¿Ideas?

preguntado el 16 de mayo de 11 a las 19:05

3 Respuestas

Terminé resolviendo este problema anulando el serializador JSON incluido de Django, específicamente el método handle_field, en un archivo de serializador personalizado llamado custom_json_serializer.py. Al hacer esto, puedo asegurarme de que JSONFields específicos permanezcan como están, sin convertirse en cadenas.

Si alguien más se encuentra con este problema, estos son los pasos que tomé. Tuve que agregar este serializador personalizado al archivo settings.py:

SERIALIZATION_MODULES = {       
    'custom_json': 'myapp.utils.custom_json_serializer',
}

y luego llamarlo cuando serialice los datos de Django:

python manage.py dumpdata mymodel --format=custom_json --indent=2 --traceback > mymodel_data.json

El serializador personalizado se ve así:

from django.core.serializers.json import Serializer as JSONSerializer
from django.utils.encoding import is_protected_type

# JSONFields that are normally incorrectly serialized as strings
json_fields = ['problem_field1', 'problem_field2']


class Serializer(JSONSerializer):
    """
    A fix on JSONSerializer in order to prevent stringifying JSONField data.
    """
    def handle_field(self, obj, field):
        value = field._get_val_from_obj(obj)
        # Protected types (i.e., primitives like None, numbers, dates,
        # and Decimals) are passed through as is. All other values are
        # converted to string first.
        if is_protected_type(value) or field.name in json_fields:
            self._current[field.name] = value
        else:
            self._current[field.name] = field.value_to_string(obj)

La parte realmente extraña es que antes de esta solución, algunos JSONFields se serializaban bien, mientras que otros no. Es por eso que tomé el enfoque de especificar los campos a manejar. Ahora todos los datos se serializan correctamente.

contestado el 21 de mayo de 11 a las 03:05

No he usado JSONField antes, pero lo que hago es:

import json

data_structure = json.loads(myData)

Quizás eso también funcione para lo que necesitas. Probablemente haya una mejor manera de lidiar con esto.

contestado el 16 de mayo de 11 a las 23:05

EDITAR: Si termina usando el paquete json, solo entonces es aplicable la siguiente solución.

Si está usando Python 2.6 y superior, puede usar:

import json

de lo contrario, puede usar el simplejson que se incluye con django.utils (para Python <2.6).

from django.utils import simplejson as json

De esa manera, puede continuar usando el mismo nombre de paquete y llevar su código a Google App Engine, ya que es compatible con Python 2.5.2 en este momento.

contestado el 17 de mayo de 11 a las 02:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.