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

标签 python django class model self

我在理解 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()

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

关于python - 为什么我不能将模型方法用作默认值?无论如何,Python/Django 模型中的 self 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32579938/

相关文章:

sql - 在 django raw sql 中传递列表或元组作为参数

django - GeoDjango - LayerMapping : An error occurred in the current transaction. 在 'atomic' block 结束之前你不能执行查询

使用将在派生构造函数中构造的参数调用的 C++ 基本构造函数

c++ - websocketpp 回调(通过函数指针的类方法)

python - 两个永无休止的Python脚本之间的交互

python - Mypy 允许 `List[str]` 具有 `Tuple[str, List[str]]` 类型的值

python - 字符串格式不受支持的操作数

django - 从Django中的选择中获取显示值的键值

c++ - 为什么映射的构造函数允许我们在参数中传递比较器对象?

python eyed3 eyed3.id3.tag.CommentsAccessor 对象位于 0x7fbb2316d890