了解django loaddata或正确的方法来获取fixtures的dumpdata

时间:2011-09-16 08:20:30

标签: python django

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

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

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

我添加了

   print field.name
在django.core.serializers.python中

并手动找到无效值。但这不是好办法。

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

2 个答案:

答案 0 :(得分: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这样的“格式”参数。它根据文件扩展名决定格式。但我找不到办法 挂钩我的自定义编码器,所以我不得不写一个“新”序列化器:(

这就是几个月前我需要编写自定义序列化程序时所做的事情 我不得不深入研究django的源代码来解决这个问题 官方文件对这个问题一无所知。我希望它能提供一些帮助。

答案 1 :(得分:-2)

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