2011-05-16 9 views
7

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

Hasta ahora no he tenido suerte manteniendo estos datos JSON intactos al usar 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 para esto ... ¿Ideas?

Respuesta

6

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 asegurar que los JSONFields específicos permanezcan como están, sin convertirlos a cadenas.

En caso de que alguien más se encuentre con este problema, estos son los pasos que tomé. He tenido que añadir este serializador personalizado al archivo settings.py:

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

y luego llamar al serializar los datos de Django:

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

El serializador personalizado parece:

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 corrección algunos JSONFields se serializaban muy bien, mientras que otros no. Es por eso que tomé el enfoque de especificar los campos que se manejarán. Ahora todos los datos se serializan correctamente.

0

No he utilizado la JSONField antes, pero lo que sí es:

import json 

data_structure = json.loads(myData) 

Tal vez que funcione para lo que necesita también. Es probable que haya una mejor manera de lidiar con esto.

0

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

Si está utilizando Python 2.6 y anterior se puede utilizar:

import json 

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

from django.utils import simplejson as json 

De este modo puede seguir utilizando el mismo nombre de paquete, y tomar su código de Google App Engine, ya que soporta Python 2.5.2 en el momento.