Python 在运行makemigrations时,从django 1.6升级到1.7可调用不是序列化的
在我们的项目中,我们使用一个可调用函数动态地生成upload_to destination,如下所示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
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