如何让Django Rest Framework将小数舍入到最大精度?

jaa*_*ap3 4 decimal rounding django-rest-framework

我有一个带有DecimalField的Django Rest Framework序列化程序

serializers.DecimalField(max_digits=9, decimal_places=6)
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试反序列化包含具有更高精度的十进制数据(即50.1234567),则序列化程序会引发ValidationError:

"Ensure that there are no more than 6 decimal places."
Run Code Online (Sandbox Code Playgroud)

如果最后一位数为0,甚至会发生这种情况.是否可以使串行器将给定值舍入到最大精度(即50.1234567到50.123457)?如果是这样怎么样?

jaa*_*ap3 10

在将输入强制转换为Decimal后,DecimalField会验证恰当命名但未记录的validate_precision方法中的值的精度.因此,要禁用此验证,可以覆盖此方法并只返回输入值:

class RoundingDecimalField(serializers.DecimalField):
    def validate_precision(self, value):
        return value
Run Code Online (Sandbox Code Playgroud)

事实证明,这样做足以获得所需的舍入行为.

调用validate_precisionDecimalField调用后quantize,将"将十进制值量化为配置的精度"(来自docstring).

该量化过程的舍入模式由当前有效的小数上下文控制.

如果需要特定的舍入模式,可以使用drf_braces.fields.custom.RoundedDecimalField来自django-rest-framework-braces的(再次未记录的)字段.该字段采用可选的舍入参数,其中可以指定所需的舍入模式.