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

标签 python django

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

相关文章:

Django:捕获完整性错误与 qs.exists() 哪个更有效?

python - 使用 docker-compose 初始化 django 应用程序

Python计算

python - 如何在 python 控制台中运行 Odoo ORM 方法?

python - 如何获取对象以及多对多对象信息

django - django 1.3+ 的简单日志到文件示例

c++ - 如何使用 Python C/API 包装多线程 C++ 库?

python - Python 2.2 中的设置函数

python - 使用 TabularInlines 使 Django-Jet 自动完成

django - 如何从模态内的模型创建和提交表单?