Обновление до Django 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. Любая помощь приветствуется.

Ответы

Ответ 1

Просто создайте деконструктивный подкласс и используйте его вместо этого.

from django.utils.deconstruct import deconstructible


@deconstructible
class MyS3BotoStorage(S3BotoStorage):
    pass

Ответ 2

Основная проблема заключается в том, что вы пытаетесь использовать Django 1.7 с пакетом (django-storages), который пока не обновлен для работы с этой версией.

Вот несколько выдержек из документации, чтобы объяснить, что происходит:

Миграции - это только файлы Python, содержащие старые определения ваших моделей. Таким образом, чтобы записать их, Django должен взять текущее состояние ваших моделей и сериализовать их в файл.

В то время как Django может сериализовать большинство вещей, есть некоторые вещи, которые мы просто не можем сериализовать в действительное представление Python - нет стандарта Python для того, как значение можно вернуть обратно в код.

Вы можете позволить Django сериализовать свои собственные экземпляры класса, предоставив классу метод deconstruct().

Итак, решение здесь - дать метод класса storages.backends.s3boto.S3BotoStorage a deconstruct(). Это, вероятно, будет так же просто, как применение декоратора @deconstructible.

Предположительно пакет включит это изменение в какой-то момент (или, возможно, главная ветвь уже имеет его?), но вы также можете просто исправить его самостоятельно.