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

Django模型序列化器中如何规范化price字段去除末尾零?

序列化器中去除价格字段末尾零的实现方法

当然可以在序列化器里实现这个需求,下面给你两种实用的方案:

方案一:使用SerializerMethodField

直接在序列化器里重写price字段的取值逻辑,调用normalize()处理末尾零,还能顺便把整数形式的价格转成纯整数(比如把50.0转成50):

class FoooSerializers(serializers.ModelSerializer):
    price = serializers.SerializerMethodField()

    class Meta:
        model = Food
        fields = ['id', 'price']

    def get_price(self, obj):
        # 调用Decimal的normalize()去除末尾零
        normalized_price = obj.price.normalize()
        # 如果处理后是整数,转成int类型避免显示成x.0
        if normalized_price == normalized_price.to_integral():
            return int(normalized_price)
        return normalized_price

方案二:自定义可复用的Decimal字段

如果多个序列化器都需要处理这类字段,自定义一个字段会更方便,后续直接复用即可:

from rest_framework import serializers

class NormalizedDecimalField(serializers.DecimalField):
    def to_representation(self, value):
        # 先标准化去除末尾零
        normalized_value = value.normalize()
        # 整数情况转成int返回
        if normalized_value == normalized_value.to_integral():
            return int(normalized_value)
        # 非整数情况调用父类方法返回字符串形式(保持精度)
        return super().to_representation(normalized_value)

# 在序列化器中使用自定义字段
class FoooSerializers(serializers.ModelSerializer):
    # 这里的max_digits和decimal_places要和你模型中price字段的参数对应
    price = NormalizedDecimalField(max_digits=10, decimal_places=3)

    class Meta:
        model = Food
        fields = ['id', 'price']

注意事项

  • 确保你模型中的price字段是DecimalField类型,normalize()是Decimal类型的方法,FloatField不建议用,会有精度丢失问题。
  • 如果不需要把50.0转成50,只保留Decimal的标准化形式(比如50),可以去掉判断整数的逻辑,直接返回normalized_price即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:51:39