Django:在Django模型中调用自身函数

3 投票
3 回答
5440 浏览
提问于 2025-04-16 00:17

我想在上传时调用一个模型类的自定义函数,像这样:

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"

撰写回答