Обновление с 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 Из models.py
  • django Queryset с годом (датой) = '2010'
  • django создает строку в таблице userprofile при создании пользователя
  • как создать контурный цикл в шаблоне django?
  • Ткань запрашивает пароль, хотя я могу использовать SSH с учетными данными
  • Как игнорировать каталоги при запуске Django collectstatic?
  • Вложенные поля django rest с несколькими моделями
  • Python - лучший язык программирования в мире.