- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在这里遇到了一个范式问题。我不知道是否应该将钱存储为 Decimal(),或者是否应该将其存储为字符串并自己将其转换为小数。我的理由是这样的:
PayPal 需要 2 位小数,所以如果我有一个 49 美元的产品,PayPal 希望看到 49.00 的电汇。 Django 的 DecimalField() 没有设置小数。它仅存储最大小数位数。所以,如果你有 49,并且你将字段设置为小数点后 2 位,它仍然会将它存储为 49。我知道 Django 在从数据库反序列化回十进制时基本上是类型转换(因为数据库没有小数字段),所以我并不完全关心速度问题,就像我关心这个问题的设计问题一样。我想做最好的可扩展性。
或者,更好的是,有谁知道如何将 django DecimalField() 配置为始终使用 TWO_PLACES 格式化样式。
最佳答案
您可能想要使用 .quantize()
方法。这会将十进制值四舍五入到一定位数,您提供的参数指定位数:
>>> from decimal import Decimal
>>> Decimal("12.234").quantize(Decimal("0.00"))
Decimal("12.23")
它也可以带一个参数来指定你想要的四舍五入方法(不同的会计系统可能需要不同的四舍五入)。更多信息请访问 Python docs .
下面是一个自动生成正确值的自定义字段。请注意,这仅在从数据库中检索时使用,并且在您自己设置时不会帮助您(直到您将其保存到数据库并再次检索它!)。
from django.db import models
from decimal import Decimal
class CurrencyField(models.DecimalField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
try:
return super(CurrencyField, self).to_python(value).quantize(Decimal("0.01"))
except AttributeError:
return None
[编辑]
添加了__metaclass__
,见Django: Why does this custom model field not behave as expected?
关于python - Django:我应该如何存储货币值(value)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2013835/
我是一名优秀的程序员,十分优秀!