升级到Django 1.7. 出现错误:无法序列化:<storages.backends.s3boto.S3BotoStorage对象
我正在尝试把一个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