【问题标题】:Understanding django loaddata or right way to dumpdata for fixutes了解 django loaddata 或为夹具转储数据的正确方法
【发布时间】:2011-11-18 12:10:36
【问题描述】:

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

怎么理解,哪一行dump错了?或者我在哪个模型中得到了这个错误?

更新: 问题来自无效的夹具。但我不明白,为什么 django 哑数据会创建无效的固定装置。

我已经添加了

   print field.name

在 django.core.serializers.python 中手动发现无效值。但这不是好办法。

UPD。 我仍然对转储任何模型的数据并将其作为固定装置在测试中重用的方法感兴趣。我正在使用 postgresql 进行开发。

【问题讨论】:

  • 这也是为什么我不喜欢在 Django 中使用 SQLite 的原因之一,即使是用于开发。
  • 您需要提供更多数据:模型字段是什么?从中产生的json是什么?现在“一个夹具”给出了一个错误,“所有的序列化器都是错误的”。实际上它们通常可以工作,所以你必须展示一个真实的例子:-)
  • 例如,你可以尝试序列化十进制字段。稍后我将提供输入/输出的详细示例。

标签: python django


【解决方案1】:

首先,您是否使用任何自定义/第 3 方字段?

虽然如果你这样做并且 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()

然后在你的setting.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 的源代码才能弄清楚,因为 官方文档对此一无所知。我希望它能提供一些帮助。

【讨论】:

  • 稍微好一点:代替'myjson',只需使用'json' 覆盖默认值。你不再需要--format myjson了!
  • @DavidArcos 这不一定是您想要的,因为全局覆盖 JSON 序列化程序可能会产生意想不到的后果。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2020-02-25
    • 2011-03-07
    • 1970-01-01
    • 2018-03-14
    • 2016-05-24
    • 2014-02-17
    • 2013-05-08
    • 2013-05-12
    相关资源
    最近更新 更多