gpt4 book ai didi

python - Django:我应该如何存储货币值(value)?

转载 作者:IT老高 更新时间:2023-10-28 21:42:25 25 4
gpt4 key购买 nike

我在这里遇到了一个范式问题。我不知道是否应该将钱存储为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com