我跟进我的问题Creating new objects under specific parameters。我试图找出如何将函数写入django模型中以在字段上创建默认值。我知道该怎么做,但现在想更进一步,将参数添加到函数中,并使用以前的字段作为参数。到目前为止,我已经尝试了以下方法,并且在尝试迁移它们时,每个人都给出了自己的错误消息。
class NewTest(models.Model):
score = models.IntegerField(default=0)
def num(score): # Want the score parameter to be the score field
new_num = score
return new_num
last_score = models.IntegerField(default=num(score))
Error: int() argument must be a string, a bytes-like object or a number, not 'IntegerField'
class NewTest(models.Model):
score = models.IntegerField(default=0)
def num(self):
new_num = self.score
return new_num
last_score = models.IntegerField(default=num(self))
NameError: name 'self' is not defined
class NewTest(models.Model):
score = models.IntegerField(default=0)
def num():
new_num = self.score
return new_num
last_score = models.IntegerField(default=num)
NameError: name 'self' is not defined
有人知道该怎么做,或者知道在哪里有文档吗?
答案 0 :(得分:0)
可调用的Django模型字段default
实际上不是实例方法。由于此可调用函数在迁移中的使用方式,因此必须可序列化以进行迁移,例如在迁移过程中,您会看到对函数路径的引用,例如default="my_app.models.my_callable_default"
。
我看到的其他解决方案是重写模型save
方法来检查这些字段并在那里设置默认值。
class NewTest(models.Model):
score = models.IntegerField(default=0)
last_score = models.IntegerField(default=0)
def save(self, *args, **kwargs):
if not self.pk: # Check for create
self.last_score = self.score
else:
# Get the existing score from the database, because this instance has been modified
score_from_db = NewTest.objects.values("score").get(pk=self.pk)["score"]
self.last_score = self.score
return super().save(*args, **kwargs) # Continue with save as normal
此解决方案会覆盖模型的save
方法,以便在创建过程中为last_score
字段分配另一个字段值,如果是更新,它将从数据库中获取现有对象以获取最后一个对象得分(我不确定这是否是您追求的目标)。 if not self.pk
用于检查是针对新对象(创建)还是现有对象(更新)调用当前保存,因为数据库在创建过程中分配了主键。