将模型字段作为参数传递给函数以创建其他字段

时间:2019-07-12 01:28:19

标签: django django-models

我跟进我的问题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

有人知道该怎么做,或者知道在哪里有文档吗?

1 个答案:

答案 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用于检查是针对新对象(创建)还是现有对象(更新)调用当前保存,因为数据库在创建过程中分配了主键。