Ответ 1
Просто создайте деконструктивный подкласс и используйте его вместо этого.
from django.utils.deconstruct import deconstructible
@deconstructible
class MyS3BotoStorage(S3BotoStorage):
pass
Я пытаюсь обновить приложение 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.
И вот соответствующий код:
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-хранилища и boto для сохранения файлов на Amazon S3. Любая помощь приветствуется.
Просто создайте деконструктивный подкласс и используйте его вместо этого.
from django.utils.deconstruct import deconstructible
@deconstructible
class MyS3BotoStorage(S3BotoStorage):
pass
Основная проблема заключается в том, что вы пытаетесь использовать Django 1.7 с пакетом (django-storages
), который пока не обновлен для работы с этой версией.
Вот несколько выдержек из документации, чтобы объяснить, что происходит:
Миграции - это только файлы Python, содержащие старые определения ваших моделей. Таким образом, чтобы записать их, Django должен взять текущее состояние ваших моделей и сериализовать их в файл.
В то время как Django может сериализовать большинство вещей, есть некоторые вещи, которые мы просто не можем сериализовать в действительное представление Python - нет стандарта Python для того, как значение можно вернуть обратно в код.
Вы можете позволить Django сериализовать свои собственные экземпляры класса, предоставив классу метод deconstruct().
Итак, решение здесь - дать метод класса storages.backends.s3boto.S3BotoStorage
a deconstruct()
. Это, вероятно, будет так же просто, как применение декоратора @deconstructible
.
Предположительно пакет включит это изменение в какой-то момент (или, возможно, главная ветвь уже имеет его?), но вы также можете просто исправить его самостоятельно.