Skip to main content
 首页 » 编程设计

python之为什么我不能将模型方法用作默认值无论如何,Python/Django 模型中的 self 是什么

2025年05月04日32三少

我在理解 self 的行为时遇到了一个非常基本的问题。

具体来说,我不明白为什么以下两段代码都不起作用,第一个导致解释器提示

self is missing as an argument,

第二个

self couldn't be referenced.

class Model(models.Model) 
    name = models.CharField(max_length=200) 
    auto_gen_field = models.CharField(max_length=200, default=gen_field()) 
 
    def gen_field(self): 
        return self.name + 'something' 

class Model(models.Model) 
    name = models.CharField(max_length=200) 
    auto_gen_field = models.CharField(max_length=200, default=gen_field(self)) 
 
    def gen_field(self): 
        return self.name + 'something' 

以下代码也使用了 self,运行良好:

class Model(models.Model) 
    name = models.CHarField(max_length=200) 
    auto_gen_field = models.CharField(max_length=200, blank=True) 
 
    def gen_field(self): 
        return self.name + 'something' 
 
    def save(self): 
        self.auto_gen_field = self.gen_field() 
        super(Model, self).save(*args, **kwargs) 

为什么 self 引用存在于一处而另一处不存在?

如何修复前两个片段?

请您参考如下方法:

您在声明字段时调用该方法。那时没有self。

无论如何你都不想那样做。除了 self 的任何问题外,这样做会返回默认的静态值,因此所有实例都将使用相同的值。这就是为什么传递 callable 很重要:gen_field - 而不是结果 - gen_field()。

(但请注意,这仍然行不通:实例不会被传递给函数,因为它没有作为实例上的方法被调用。覆盖保存是要走的路。)