gpt4 book ai didi

Django JSONField转储/加载

转载 作者:行者123 更新时间:2023-12-04 07:44:04 30 4
gpt4 key购买 nike

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

到目前为止,当使用Django的dumpdata和loaddata命令时,我仍然没有运气来保持JSON数据的完整性,而是将数据转换为JSON的字符串表示形式。我还没有找到一个很好的解决方案...想法?

最佳答案

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

如果有其他人遇到这个问题,这些就是我所采取的步骤。我必须将此自定义序列化器添加到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)

真正奇怪的是,在此修复程序之前,一些JSONFields可以很好地进行序列化,而另一些则不能。这就是为什么我采用指定要处理的字段的原因。现在,所有数据都在正确序列化。

关于Django JSONField转储/加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022084/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com