Django REST框架:在验证之前转换值

时间:2019-05-07 17:58:32

标签: python django django-rest-framework

我有以下模型:

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位”。

1 个答案:

答案 0 :(得分:3)

DRF调用to_internal_value将编码后的请求数据转换为python数据类型,然后再对这些python对象进行显式验证。您看到的错误是在DecimalField.to_internal_value中触发的。

我认为,处理此问题的最干净的方法是告诉DRF您期望的请求数据是什么样,允许serializers.DecimalField将请求转换为python,然后在{{1}中处理您的转换}序列化器的方法。这样的事情(我猜你的序列化器名称和基类):

validate_progress

注意:您也可以在序列化程序级别使小数字段更宽松,然后四舍五入validate方法。