Обновление до Джанго 1.7. Получение ошибки: Невозможно сериализовать: <storages.backends.s3boto.S3BotoStorage object
Я пытаюсь обновить приложение 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. Любая помощь приветствуется.
2 ответа
Просто создайте разрушаемый подкласс и используйте его вместо этого.
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
deconstruct()
метод. Это, вероятно, будет так же просто, как применение @deconstructible
класс декоратора.
Предположительно, пакет будет включать это изменение в какой-то момент (или, возможно, ветка master уже имеет его?), Но вы также можете просто исправить это самостоятельно.