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

Max*_*fer 1 python django model class self

在了解的行为方面,我有一个非常基本的问题self

具体来说,我不明白以下两个代码段为何都不起作用,第一个导致解释器抱怨:

self 作为论据而缺失,

第二个

self 无法引用。

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'
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)

以下代码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)
Run Code Online (Sandbox Code Playgroud)

为什么self引用存在于一个地方而不是另一个地方?

如何修复前两个片段?

Dan*_*man 5

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

您还是不想这样做。除了self的任何问题外,这样做会为默认值返回一个静态值,因此所有实例将使用相同的值。这就是为什么传递可调用对象很重要:gen_field-而不是结果-的原因gen_field()

(但是请注意,这仍然行不通:不会将实例传递给函数,因为不会将其作为实例上的方法调用。覆盖保存是一种方法。)