You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django REST Framework中DECIMAL类型字段API返回字符串问题咨询

解决Django REST Framework中DECIMAL字段返回字符串的问题

这个问题我之前也碰到过,DRF默认会把DECIMAL类型序列化为字符串,主要是为了避免浮点数的精度丢失问题。但如果你的业务场景需要返回数字类型(比如前端需要直接进行数值计算),可以通过以下两种方法解决:

方法一:在序列化器中单独指定字段行为

最直接的方式是在对应的ModelSerializer里,为discount字段显式定义DecimalField并设置coerce_to_numeric=True,这样DRF就会把它序列化为数字类型而不是字符串。

首先定义你的序列化器:

from rest_framework import serializers
from .models import Discount  # 替换成你的实际模型类

class DiscountSerializer(serializers.ModelSerializer):
    # max_digits和decimal_places要和你数据库中DECIMAL字段的定义一致
    discount = serializers.DecimalField(max_digits=10, decimal_places=3, coerce_to_numeric=True)

    class Meta:
        model = Discount
        # 列出所有需要返回的字段,和你当前API返回的字段对应
        fields = ['id', 'name', 'discount', 'belong_product', 'ctime', 'desc', 'is_enable', 'max_count', 'min_count', 'uptime']

然后在你的ListAPI视图类中使用这个序列化器:

from rest_framework.generics import ListAPIView
from .models import Discount
from .serializers import DiscountSerializer

class DiscountItemByUserOwnCountListAPIView(ListAPIView):
    queryset = Discount.objects.all()  # 根据你的业务逻辑调整查询集,比如过滤用户拥有的记录
    serializer_class = DiscountSerializer

方法二:全局修改所有DECIMAL字段的序列化行为

如果你的项目中有很多DECIMAL字段都需要返回数字类型,可以在settings.py中修改DRF的全局配置,开启COERCE_DECIMAL_TO_STRING=False:

REST_FRAMEWORK = {
    # 其他配置...
    'COERCE_DECIMAL_TO_STRING': False,
}

这样所有的DECIMAL字段都会默认序列化为数字类型,但要注意:这种方式可能会导致某些高精度的Decimal值在转为浮点数时出现精度损失,所以如果你的业务对精度要求极高(比如金融场景),建议优先使用方法一单独控制字段行为。

补充说明

  • max_digits和decimal_places必须和你数据库中discount字段的定义匹配,比如数据库中是DECIMAL(10,3),那这里就设置对应的参数。
  • 如果前端能处理字符串类型的数值,其实保留默认的字符串返回也是安全的选择,毕竟可以完全避免精度丢失问题。

内容的提问来源于stack exchange,提问作者user7693832

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:35:36