如何在模型中创建一个字段,其值是使用其他字段中的值计算的?

How do i create a field in my model whose value is calculated using values from other fields?

提问人:Saif eldeen Adel 提问时间:2/11/2021 更新时间:2/11/2021 访问量:363

问:

我有一个模型,它接受 3 个整数作为其字段的一部分

class TradeBill(models.Model):
    ......
    first = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(2)])
    second = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(2)])
    third = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(2)])
    .....

我需要的是另一个正整数字段,它将其他三个的值相加。目前我只是把它作为这个,从而在前端处理它:score

score = models.PositiveIntegerField(default= 0, validators=[MaxValueValidator(6)])

但这并不是很好,因为我可以输入我想要的任何值,例如来自管理员或我拥有的任何前端输入。当然,我可以进行前端验证以阻止它发生,但是当涉及到他们的功能时,django 从未让我失望,所以我确定我可以做些什么

Django Django-模型

评论


答:

2赞 VJ Magar 2/11/2021 #1

您无需创建其他字段,而是可以创建模型的属性scorescore

class TradeBill(models.Model):
    ...
    @property
    def score(self):
           return self.first + self.second + self.third
    ...

编辑扩展答案以包括序列化程序。 还可以在序列化程序中包含模型的属性

class TradeBillSerializer(serializers.ModelSerializer):
       class Meta:
           fields = ("score", ...)

此外,您可以使用(正如 @Saif eldeen Adel 在评论中提到的。SerializerMethodField

class TradeBillSerializer(serializers.ModelSerializer):
       
     score = serializers.SerializerMethodField()

     def get_score(self, obj):
         return obj.score

     class Meta:
           fields = ("score", ...)

SerializerMethodField提供对字段执行添加处理或格式设置的灵活性。

评论

0赞 Saif eldeen Adel 2/11/2021
有趣的是,所以这个属性装饰器将允许我访问实例的分数,但它不会是我在数据库中看到的实际字段?如果我构建一个 rest API,我可以正常序列化这个字段/值/属性吗?tradebill.score
1赞 Saif eldeen Adel 2/11/2021
Nvm,意识到我可以在我的序列化程序中添加一个方法字段来获取 instance.score 并将其存储在分数“字段”中