理解Django的loaddata或正确的dumpdata方法用于固定数据
我用 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的源代码来弄明白,因为官方文档对此没有任何说明。希望这能对你有所帮助。