Обновление до Джанго 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 уже имеет его?), Но вы также можете просто исправить это самостоятельно.

Другие вопросы по тегам