我有以下模型:
class Runner(Base):
# ...
progress = models.DecimalField(
max_digits=5,
decimal_places=4
)
我希望用户可以输入20并将数字转换为0.20。 我之前已经使用clean方法以某种形式完成了此操作。
def clean_progress(self):
progress = self.cleaned_data.get('progress')
if progress is not None:
progress /= 100
return progress
有人知道如何在REST API中执行此操作吗? 我只找到了validate_progress方法,但不适用于该方法,因为在此之前进行了一些验证,这使我出现错误“确保小数点前的位数不超过1位”。
答案 0 :(得分:3)
DRF调用to_internal_value
将编码后的请求数据转换为python数据类型,然后再对这些python对象进行显式验证。您看到的错误是在DecimalField.to_internal_value
中触发的。
我认为,处理此问题的最干净的方法是告诉DRF您期望的请求数据是什么样,允许serializers.DecimalField
将请求转换为python,然后在{{1}中处理您的转换}序列化器的方法。这样的事情(我猜你的序列化器名称和基类):
validate_progress
注意:您也可以在序列化程序级别使小数字段更宽松,然后四舍五入validate方法。