Python 在运行makemigrations时,从django 1.6升级到1.7可调用不是序列化的

Python 在运行makemigrations时,从django 1.6升级到1.7可调用不是序列化的,python,django,Python,Django,在我们的项目中,我们使用一个可调用函数动态地生成upload_to destination,如下所示 class PKUploader(object): def __init__(self, prefix, extension=None): self.prefix = prefix self.extension = extension def __call__(self, instance, filename): ext = se

在我们的项目中,我们使用一个可调用函数动态地生成upload_to destination,如下所示

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
ValueError:无法序列化:
有些值Django无法序列化到迁移文件中。
有关更多信息,请参阅https://docs.djangoproject.com/en/dev/topics/migrations/#migration-连载

有人能解释一下吗?

如果将可调用变量指定给一个变量,则应该避免此错误

upload_to = PKUploader('users_image')

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

要序列化任意类的实例,需要实现
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
装饰器:

from django.utils.deconstruct import deconstructible

@deconstructible
class PKUploader(object):
    ...

有关详细信息,请参阅

这有什么关系?如果字段定义中有
PKUploader('users_image')
,则它是一个匿名函数(即,它没有绑定到名称),因此无法序列化。将结果分配给变量可使其序列化。这似乎不是问题所在:S