【问题标题】:Django: How to Set Default Field Value By Model MethodDjango:如何通过模型方法设置默认字段值
【发布时间】:2019-08-05 11:34:53
【问题描述】:

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

我理想的做法是这样的:

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_default 方法无权访问self。 我尝试过的一种解决方案是覆盖 save() 方法。问题是它会阻止用户进一步更改分数字段。

我搜索的另一种方法是覆盖类的 inti。但是根据 django 的说法,如果没有正确实施,它可能会产生后果。

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

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

【问题讨论】:

  • 默认值不能是采用self 的可调用对象。 default=... 是不带参数或值的可调用对象。
  • 不要为此使用default。而是将计算添加到模型的 save() 方法中。

标签: python django


【解决方案1】:

calculate_default 方法无权访问 self.我尝试过的一种解决方案是覆盖 save() 方法。问题是它会阻止用户进一步更改分数字段。

其实这是正确的方法。但是你可以在save()方法中检查score的值是否为空:

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

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

【讨论】:

  • 这似乎是合理的,但它对我不起作用。原因:您的样本中有错字:“scrore”-> score。现在有效。
猜你喜欢
  • 2015-06-30
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多