升级到Django 1.7. 出现错误:无法序列化:<storages.backends.s3boto.S3BotoStorage对象

16 投票
2 回答
3945 浏览
提问于 2025-04-19 14:55

我正在尝试把一个django应用从版本1.6.6升级到1.7,使用的python版本是2.7.8。当我运行 python manage.py makemigrations 这个命令时,出现了以下错误:

ValueError: Cannot serialize: <storages.backends.s3boto.S3BotoStorage object at 0x11116eed0>
There are some values Django cannot serialize into migration files.

这里是相关的代码:

protected_storage = storages.backends.s3boto.S3BotoStorage(
      acl='private',
      querystring_auth=True,
      querystring_expire=3600,
    )


    class Document(models.Model):
        ...
        file = models.FileField(upload_to='media/docs/', max_length=10000, storage=protected_storage)

        def __unicode__(self):
            return "%s" % self.candidate

        def get_absolute_url(self):
            return reverse('documents', args=[str(self.pk)])

我已经阅读了迁移的文档,也看过一个类似的问题 在这里,但我还是没能解决这个问题。我的应用使用了django-storages和boto来把文件保存到亚马逊的S3服务上。任何帮助都非常感谢。

2 个回答

7

这里的主要问题是,你正在尝试使用Django 1.7版本,但有一个叫做django-storages的包似乎还没有更新到可以和这个版本兼容。

下面是一些来自文档的摘录,来解释发生了什么:

迁移(migrations)其实就是一些Python文件,里面包含了你模型的旧定义。因此,为了写这些文件,Django需要获取你模型的当前状态,并把它们转换成文件。

虽然Django可以处理大部分内容,但有些东西我们无法转换成有效的Python表示形式——因为没有一个Python标准来说明一个值应该如何被转回代码。

你可以通过给你的自定义类实例添加一个deconstruct()方法,让Django能够处理这些实例。

所以解决办法就是给类storages.backends.s3boto.S3BotoStorage添加一个deconstruct()方法。这可能很简单,只需要使用@deconstructible这个类装饰器就可以了。

这个包可能会在某个时候加入这个改动(或者主分支已经有了?),但你也可以自己动手修复它。

29

只需要创建一个可以拆解的子类,然后用它来代替就可以了。

from django.utils.deconstruct import deconstructible


@deconstructible
class MyS3BotoStorage(S3BotoStorage):
    pass

撰写回答