理解Django的loaddata或正确的dumpdata方法用于固定数据

3 投票
2 回答
4898 浏览
提问于 2025-04-17 02:25

我用 manage.py dumpdata 把我项目里的4个应用的数据导出了。但是当我想把这些数据作为测试的固定数据加载时,出现了“验证错误:这个值必须是 True 或 False”的提示。

我该怎么找出是哪一行数据出错了?或者是哪个模型出现了这个错误?

更新:问题出在无效的固定数据上。但是我不明白,为什么 Django 的 dumpdata 会生成无效的固定数据。

我在 django.core.serializers.python 里添加了

   print field.name

并手动找到了无效的值。但这样做不太好。

更新:我仍然想知道如何为任何模型导出数据,并在测试中作为固定数据重用。我在开发中使用的是 PostgreSQL。

2 个回答

-3

可以试着使用一些JSON验证工具,比如这个:http://jsonlint.com/

9

首先,你有没有使用任何自定义的或者第三方的字段?

如果你用了这些字段,而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()

然后在你的settings.py文件中添加:

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

接着在你的命令行中可以这样做:

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

你可以用以下方式加载它:

python manage.py loaddata myfixtures.myjson

奇怪的是,loaddata并不接受像dumpdata那样的“格式”参数。它是根据文件的扩展名来决定格式的。不过,我找不到方法来连接我的自定义编码器,所以我不得不写一个“新的”序列化器 :(

这就是几个月前我需要编写自定义序列化器时所做的事情,我不得不翻阅Django的源代码来弄明白,因为官方文档对此没有任何说明。希望这能对你有所帮助。

撰写回答