Обновление до Джанго 1.7. Получение ошибки: невозможно сериализовать: объект ‹storages.backends.s3boto.S3BotoStorage

Я пытаюсь обновить приложение 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-storages и boto для сохранения файлов на Amazon S3. Любая помощь приветствуется.


person mcastle    schedule 03.09.2014    source источник


Ответы (2)


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

from django.utils.deconstruct import deconstructible


@deconstructible
class MyS3BotoStorage(S3BotoStorage):
    pass
person Dominique PERETTI    schedule 24.10.2014

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

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

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

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

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

Таким образом, решение здесь состоит в том, чтобы дать классу storages.backends.s3boto.S3BotoStorage метод deconstruct(). Вероятно, это будет так же просто, как применить @deconstructible декоратор класса.

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

person Kevin Christopher Henry    schedule 03.09.2014