Обновление с django 1.6 до 1.7, получающего вызов, не сериализуется при запуске makemigrations

Мы динамически генерируем адрес upload_to в нашем проекте с помощью вызываемого, как показано ниже.

class PKUploader(object): def __init__(self, prefix, extension=None): self.prefix = prefix self.extension = extension def __call__(self, instance, filename): ext = self.extension or os.path.splitext(filename)[1] if not ext.startswith('.'): ext = '.' + ext if instance.pk is None: pk = random.randint(1000, 99999) else: pk = instance.pk pk = str(pk) + str(uuid.uuid4()) return '{}/{}{}'.format(self.prefix, pk, ext) 

И в наших моделях он используется как

 class CoolKids(models.Model): image = models.ImageField(upload_to=PKUploader('users_image')) 

Однако, когда мы запускаем обновление с django 1.6 до 1.7 и запускаем makemigrations, мы получаем следующую ошибку.

 ValueError: Cannot serialize: <PKUploader object at 0x7ff5f1cf0b90> There are some values Django cannot serialize into migration files. For more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing 

Может ли кто-нибудь пролить свет на это?

2 Solutions collect form web for “Обновление с django 1.6 до 1.7, получающего вызов, не сериализуется при запуске makemigrations”

Чтобы сериализовать экземпляр произвольного класса, вам необходимо реализовать метод deconstruct() :

 class PKUploader(object): def __init__(self, prefix, extension=None): self.prefix = prefix self.extension = extension def deconstruct(self): kwargs = {'prefix': self.prefix} if self.extension is not None: kwargs['extension'] = self.extension return 'import.path.to.PKUploader', (), kwargs def __call__(self, instance, filename): ... 

Возвращая путь импорта к классу, а также аргументы инициализации позиционного и ключевого слова, Django может сериализовать эту информацию на действительный код python, который воссоздает исходный экземпляр.

Чтобы упростить это, вы можете использовать @deconstructible decorator:

 from django.utils.deconstruct import deconstructible @deconstructible class PKUploader(object): ... 

Подробную информацию см. В документации .

Вы должны избегать этой ошибки, если назначить вызываемую переменную.

 upload_to = PKUploader('users_image') class CoolKids(models.Model): image = models.ImageField(upload_to=upload_to) 
  • Как создать пользователя из оболочки django
  • Django: файлы с сортировкой и размещением изображений на моем собственном файловом сервере
  • Mac osx lion, virtualenv, pil install - ошибка gcc
  • Django или mod_wsgi изменяет sys.path при запуске?
  • Уникальный сдерживающий фактор Django?
  • Шаблоны Django: создать ссылку «назад»?
  • Matplotlib svg как строка, а не файл
  • От многих до многих. ORM Django
  • Как настроить разрешения в django-rest-framework, чтобы пользователь сеанса мог только перечислять объекты, у которых есть внешний ключ для этого пользователя?
  • изменение имени импорта в python
  • Таблица Django с миллионом строк
  • Python - лучший язык программирования в мире.