前言
我們在設置商品價格的時候,希望保留兩位小數,FloatField是浮點數無法精確小數點幾位,DecimalField可以精確幾位小數點
DecimalField
models.py設置商品表模型的時候,可以把商品價格設置DecimalField
- max_digits=10 整數位的長度為10位
- decimal_places=2 小數點后2位
- blank=True 允許為空格
- null=True 允許為空
- default=0 默認值為0
- verbose_name="商品價格" 設置字段名稱
class Goods(models.Model):
"""商品表"""
goods_price = models.DecimalField(max_digits=10, decimal_places=2,
blank=True, null=True,
default=0, verbose_name="商品價格")
提交數據的時候,goods_price 值為12.1 但是查詢出來是保留2位小數點 12.10
寫到數據庫的數據是12.1
序列化DecimalField
關於DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)相關參數
- max_digits 數字中允許的最大位數。它必須是 None 或大於等於 decimal_places 的整數。
- decimal_places 以數字存儲的小數位數。
- max_value 驗證所提供的數字不大於這個值。
- min_value 驗證所提供的數字不小於這個值。
- localize 設置為 True 以便基於當前區域啟用輸入和輸出本地化。這也將強制 coerce_to_string 為 True。默認為 False。請注意,如果在設置文件中設置了 USE_L10N = True,則會啟用數據格式化。
- coerce_to_string 如果用於表示應返回字符串值,則設置為 True;如果應返回 Decimal 對象,則設置為 False。默認與 COERCE_DECIMAL_TO_STRING 設置中的鍵值相同,除非重寫,否則將為 True。如果序列化器返回 Decimal 對象,則最終輸出格式將由渲染器確定。請注意,設置 localize 會將值強制為 True。
- rounding 設置量化到配置精度時使用的舍入模式。有效值是 decimal 模塊舍入模式。默認為 None。
序列化goods_price 字段
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
class GoodsSerializer(serializers.ModelSerializer):
"""序列化商品models"""
create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', required=False)
goods_price = serializers.DecimalField(max_digits=10,
decimal_places=2,
max_value=10000.00,
min_value=0.00
)
class Meta:
model = Goods
fields = '__all__' # 返回全部的字段
此時提交成功后,goods_price變成了字符串類型
coerce_to_string 如果用於表示應返回字符串值,則設置為 True;如果應返回 Decimal 對象,則設置為 False。
goods_price = serializers.DecimalField(max_digits=10,
decimal_places=2,
max_value=10000.00,
min_value=0.00,
coerce_to_string=False
)
這時候返回的是浮點數12.0