Django:在Django模型中调用自身函数
我想在上传时调用一个模型类的自定义函数,像这样:
class Foo(models.Model):
filestack = models.FileField(upload_to=self. gen_save_path)
def gen_save_path(self):
"""
gen_save_path: void -> String
Generates the path as a string for fileStack field.
"""
return "some generated string"
但是我遇到了一个错误,提示 NameError: name 'self' is not defined
。
3 个回答
-2
在你的代码中,filestack是一个类范围内的变量,因为它没有在任何方法里定义。所以在这个范围内是不能使用self的。
我觉得你可以这样做:
filestack =models.FileField(upload_to=Foo.gen_save_path)
或者
在一个__init__
构造函数里定义filestack的值,这样你就可以使用self了!!
-2
我觉得如果你使用一个lambda函数,这样做是可行的:
class Foo(models.Model):
filestack = models.FileField(upload_to=lambda: self.gen_save_path())
def gen_save_path(self):
"""
gen_save_path: void -> String
Generates the path as a string for fileStack field.
"""
return "some generated string"
5
filestack
是一个类的属性,在声明它的时候不能使用 self,因为这个类还没有创建对象,也就是还没有 self。根据 Django 的文档,upload_to
需要两个参数,一个是实例(也就是定义了 FileField 的模型的实例),另一个是文件名(就是最开始给文件的名字)。所以你可以把 upload_to
设置成这样的一个函数。
def gen_save_path(instance, filename):
"""
gen_save_path: void -> String
Generates the path as a string for fileStack field.
"""
return "some generated string"
class Foo(models.Model):
filestack = models.FileField(upload_to=gen_save_path)
如果你想在类里面包含 gen_save_path
,可以用一个 lambda 表达式来调用 self.gen_save_path
,比如这样:
class Foo(models.Model):
filestack = models.FileField(upload_to=lambda self, fname:self.gen_save_path(fname))
def gen_save_path(self, filename):
return "some generated string"