对于类函数

时间:2015-05-23 23:57:29

标签: python django

为什么我的IDE告诉我行中有Unresolved reference to self

-->  photo = models.ImageField(upload_to=self.upload_path)

代码:

class Photo(models.Model):
    title = models.CharField(max_length=50, blank=True)
    album = models.ForeignKey(Album)
    photo = models.ImageField(upload_to=self.upload_path)
    upload = models.DateTimeField(auto_now_add=True)

    def upload_path(self, filename):
        title = self.album.title
        if " " in title:
            title.replace(" ", "_")
        return os.path.join(title, filename)

当我将upload_path函数放在类之外时,此错误不会显示。但是,我希望类中的函数能够保持整洁。

没有IDE错误,但我不确定原因。

def upload_path(self, filename):
    title = self.album.title
    if " " in title:
        title.replace(" ", "_")
    return os.path.join(title, filename)


class Photo(models.Model):
    title = models.CharField(max_length=50, blank=True)
    album = models.ForeignKey(Album)
    photo = models.ImageField(upload_to=upload_path)
    upload = models.DateTimeField(auto_now_add=True)

1 个答案:

答案 0 :(得分:9)

self只能在将其定义为参数的类方法中使用。

在这种情况下,您需要将该方法视为未绑定方法(不提供self的值),因为Django本身将作为第一个参数传入实例:

class Photo(models.Model):
    def upload_path(self, filename):
        ....

    photo = models.ImageField(upload_to=upload_path)

请注意,因为您在类定义本身中使用upload_path,所以必须在upload_path的定义之后使用。

修改

根据this bug report,Django在Python 2.x上的迁移系统存在限制,这将导致它无法使用上述代码,即使代码本身是正确的。您必须将该函数放在类外部才能使用迁移。

The documentation州:

  

如果您使用的是Python 2,我们建议您将upload_to的方法和接受callables的类似参数(例如默认值)移动到主模块体中,而不是类体。