首页 文章

了解django loaddata或正确的dumpdata方法

提问于
浏览
3

我使用manage.py dumpdata从我的项目中序列化了4个应用程序 . 但是,当我试图在测试中加载它作为一个夹具 - 我得到“验证错误:此值必须为真或假” .

怎么理解,哪一行转储错了?或者我在哪个模型中出现此错误?

UPD:问题来自无效夹具 . 但是我无法理解,为什么django dumbdata会产生无效的装置 .

我已经添加了

print field.name

在django.core.serializers.python中,手动找到无效值 . 但这不是好方法 .

UPD . 我仍然对以任何模型转储数据的方式感兴趣,并在测试中将其重新用作夹具 . 我正在使用postgresql进行开发 .

2 回答

  • 8

    首先,您使用的是任何自定义/第三方字段吗?

    虽然如果你这样做并且django的dumpdata无法将其序列化,那么我认为它会引发异常 . 无论如何,自上次我检查没有任何足够的文档来编写自定义django序列化程序,这是一个序列化自定义UUIDField的示例:

    from django.core.serializers.python import Serializer as PythonSerializer
    from django.core.serializers.json import DjangoJSONEncoder
    
    class CustomJSONEncoder(DjangoJSONEncoder):
        def default(self, obj):
            if isinstance(obj, uuid.UUID):
                return obj.hex
            return super(CustomJSONEncoder, self).default(obj)
    
    class Serializer(PythonSerializer):
        internal_use_only = False
        def end_serialization(self):
            json.dump(self.objects, self.stream, cls=CustomJSONEncoder, **self.options)
    
        def getvalue(self):
            if callable(getattr(self.stream, 'getvalue', None)):
                return self.stream.getvalue()
    

    然后在你的settting.py中添加

    SERIALIZATION_MODULES = { 'myjson' : 'path.to.my.module.with.serializer' }
    

    然后从你的shell你可以做到

    python manage.py dumpdata --format myjson > myfixtures.myjson # the extension is important!
    

    你可以加载它

    python manage.py loaddata myfixtures.myjson
    

    奇怪的是 loaddata 不接受像dumpdata这样的"format"参数 . 它根据文件扩展名决定格式 . 但我找不到挂钩我的自定义编码器的方法,所以我不得不写一个"new"序列化器:(

    这就是几个月前我需要编写自定义序列化程序时所做的事情,我不得不深入研究django的源代码来解决这个问题,因为官方文档中没有关于这个主题的内容 . 我希望它提供一些帮助 .

  • -2

    尝试使用json验证器,例如:http://jsonlint.com/

相关问题