带有 Django 1.7 迁移的 Python 2.7 未绑定方法

Posted

技术标签:

【中文标题】带有 Django 1.7 迁移的 Python 2.7 未绑定方法【英文标题】:Python 2.7 unbound method with Django 1.7 migrations 【发布时间】:2015-09-21 18:46:44 【问题描述】:

我正在升级到 Django 1.7.4 并使用新的内置迁移,但在尝试运行 makemigrations 时出现以下错误:

ValueError: Could not find function upload_callback in app_utils.
Please note that due to Python 2 limitations, you cannot serialize unbound 
method functions (e.g. a method declared and used in the same class body). 
Please move the function into the main module body to use migrations.For more information, 
see https://docs.djangoproject.com/en/1.7/topics/migrations/#serializing-values

我的模型定义:

class Discount(models.Model):
    banner = models.ImageField(
        help_text=_("Banner image for this discount"),
        upload_to=upload_to('discounts/', 'title'),
        blank=True,
        null=True
    )

还有我在app_utils.py中的上传回调:

def upload_to(path, attribute=None):
    def upload_callback(instance, filename):
        compact = filename[:50]
        try:
            attr= unicode( slugify( getattr(instance, attribute) ) )
            mypath = '%s/%s/%s' % (path, attr, compact)
        except:
            mypath = '%s%s' % (path, compact)
        return mypath
    return upload_callback

根据错误信息,表明upload_callback 未绑定。所以 我尝试将upload_callback 拉到包装函数之外,但找不到将额外的pathattribute 参数传递给upload_to 的方法。 Django的文档不清楚如何做到这一点,它只指定instancefilename是必需的。

理想情况下,我想要的是:

def upload_to(instance, filename, path, attribute=None):
    ...

有什么想法可以实现这一目标吗?

【问题讨论】:

【参考方案1】:

在网络上进行了一些认真的深入挖掘之后,我发现了这个 Django 错误报告。该解决方案似乎创建了一个可调用的工厂类:

https://code.djangoproject.com/ticket/22999

更多讨论在这里:Django - Cannot create migrations for ImageField with dynamic upload_to value

【讨论】:

以上是关于带有 Django 1.7 迁移的 Python 2.7 未绑定方法的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7 迁移

在 Heroku 上部署时出现 Django 1.7 迁移错误

在迁移中获取模型 ContentType - Django 1.7

Django 1.7 内置迁移与南迁移?

django 1.7 迁移——如何清除所有迁移并从头开始?

Django 1.7 迁移不会重新创建删除的表,为啥?