gpt4 book ai didi

python - 从 django 1.6 升级到 1.7 运行 makemigrations 时获取可调用内容不会序列化

转载 作者:行者123 更新时间:2023-12-01 04:34:30 25 4
gpt4 key购买 nike

我们使用可调用函数在项目中动态生成 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

有人能解释一下吗?

最佳答案

要序列化任意类的实例,您需要实现一个 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):
...

请参阅documentation了解完整详情。

关于python - 从 django 1.6 升级到 1.7 运行 makemigrations 时获取可调用内容不会序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com