提问人:Saif eldeen Adel 提问时间:2/11/2021 更新时间:2/11/2021 访问量:363
如何在模型中创建一个字段,其值是使用其他字段中的值计算的?
How do i create a field in my model whose value is calculated using values from other fields?
问:
我有一个模型,它接受 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 从未让我失望,所以我确定我可以做些什么
答:
2赞
VJ Magar
2/11/2021
#1
您无需创建其他字段,而是可以创建模型的属性score
score
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 并将其存储在分数“字段”中
评论