Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何通过Model方法设置默认字段值_Python_Django - Fatal编程技术网

Python Django:如何通过Model方法设置默认字段值

Python Django:如何通过Model方法设置默认字段值,python,django,Python,Django,我有一个简单的模型。我想根据同一型号的一些字段计算其中一个字段的默认值(我们称之为分数): 我的理想方法是: class ModelA(models.model): field_1 = models.IntegerField() field_1 = models.IntegerField() score = models.IntegerField(default=self.calculate_default()) def calculate_default(se

我有一个简单的模型。我想根据同一型号的一些字段计算其中一个字段的默认值(我们称之为分数):

我的理想方法是:

class ModelA(models.model):
    field_1 = models.IntegerField()
    field_1 = models.IntegerField()
    score = models.IntegerField(default=self.calculate_default())

    def calculate_default(self):
        default = (self.field_1 + self.field_2) / 2
        return default
问题:calculate\u默认方法无法访问self。 我尝试的一个解决方案是重写save()方法。问题是它阻止用户进一步更改分数字段

我搜索的另一个方法是重写类的inti。但据django称,如果不正确实施,可能会产生后果

实现这一目标最干净的方法是什么?如何设置要从同一型号的其他字段计算的字段的默认值,以便用户稍后更改

我有一种预感,
classmethod
是一条路要走,但我还没能成功

calculate_默认方法无权访问self。我尝试的一个解决方案是重写save()方法。问题是它阻止用户进一步更改分数字段

实际上,这是正确的方法。但如果score的值为空或不为空,则可以在
save()
方法中进行检查:

def save(self, *args, **kwargs):
    if self.score == None:
       self.score = self.calculate_default()
    super().save(*args, **kwargs)

仅供参考,在
classmethod
中,您无法访问
self
ModelA
对象。如果要使用的类方法不依赖于
ModelA
字段的当前实例或完全独立的值(例如:当前日期
datetime.now
),则可以使用该方法。

默认值不能是采用
self
的可调用值。
default=…
是一个不带参数或值的可调用函数。不要为此使用
default
。将计算添加到模型的
save()
方法中。这似乎是合理的,但对我来说不起作用。原因:您的示例中有一个输入错误:“scrore”->score。现在起作用了。