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

mca*_*tle 15 python django boto python-2.7 django-storage

我正在尝试将django应用程序从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.
Run Code Online (Sandbox Code Playgroud)

以下是相关代码:

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)])
Run Code Online (Sandbox Code Playgroud)

我已经阅读了迁移文档,并在这里阅读了类似的问题,但我一直无法解决这个问题.我的应用程序使用django-storages和boto将文件保存到Amazon S3上.任何帮助表示赞赏.

Dom*_*TTI 27

只需制作一个可解构的子类,然后使用它.

from django.utils.deconstruct import deconstructible


@deconstructible
class MyS3BotoStorage(S3BotoStorage):
    pass
Run Code Online (Sandbox Code Playgroud)

  • `来自django.utils.deconstruct import deconstructible` (3认同)

Kev*_*nry 6

这里的基本问题是你正在尝试将Django 1.7与一个django-storages看似尚未更新的package()一起使用.

以下是文档中的一些摘录,用于解释发生的情况:

迁移只是包含模型的旧定义的Python文件 - 因此,为了编写它们,Django必须采用模型的当前状态并将它们序列化为文件.

虽然Django可以序列化大多数东西,但有些东西我们无法将其序列化为有效的Python表示 - 没有Python标准可以将值转换回代码.

您可以让Django通过为类提供deconstruct()方法来序列化您自己的自定义类实例.

所以这里的解决方案是给类storages.backends.s3boto.S3BotoStorage一个deconstruct()方法.这可能就像应用@deconstructible类装饰器一样简单.

据推测,软件包会在某些时候包含这个变化(或者主分支已经拥有它?),但你也可以自己修补它.