Django JSONField转储/加载

时间:2011-05-16 19:05:19

标签: django json

我在我的一些Django模型中使用JSONField,并希望将这些数据从Oracle迁移到Postgres。

到目前为止,在使用Django的dumpdata和loaddata命令时,我没有幸运保持这个JSON数据,数据被转换为JSON的字符串表示。我还没有找到一个很好的解决方案...想法?

3 个答案:

答案 0 :(得分:7)

我最终通过在名为custom_json_serializer.py的自定义序列化程序文件中覆盖Django包含的JSON序列化程序(特别是handle_field方法)来解决此问题。通过这样做,我可以确保特定的JSONField保持原样,而不是转换为字符串。

如果有其他人遇到这个问题的机会,这些是我采取的步骤。我不得不将这个自定义序列化程序添加到settings.py文件中:

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

然后在从Django序列化数据时调用它:

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

自定义序列化程序如下所示:

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)

真正奇怪的是,在此修复之前,一些JSONField正在序列化,而其他人则没有。这就是为什么我采用指定要处理的字段的方法。现在所有数据都正确序列化。

答案 1 :(得分:0)

我之前没有使用过JSONField,但我所做的是:

import json

data_structure = json.loads(myData)

也许这对你所需要的东西也有效。可能有更好的方法来解决这个问题。

答案 2 :(得分:0)

编辑:如果您最终使用包json - 只有适用于以下解决方案。

如果您使用的是Python 2.6及更高版本,则可以使用:

import json

否则,您可以使用与django.utils捆绑在一起的simplejson(对于Python< 2.6)。

from django.utils import simplejson as json

这样您就可以继续使用相同的软件包名称,并将您的代码带到Google App Engine,因为它目前支持Python 2.5.2。