为什么我的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)
答案 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上的迁移系统存在限制,这将导致它无法使用上述代码,即使代码本身是正确的。您必须将该函数放在类外部才能使用迁移。
如果您使用的是Python 2,我们建议您将upload_to的方法和接受callables的类似参数(例如默认值)移动到主模块体中,而不是类体。