用于表示美元金额的最佳 django 模型字段是啥?

Posted

技术标签:

【中文标题】用于表示美元金额的最佳 django 模型字段是啥?【英文标题】:What is the best django model field to use to represent a US dollar amount?用于表示美元金额的最佳 django 模型字段是什么? 【发布时间】:2010-11-11 11:35:12 【问题描述】:

我需要在 Django 模型的字段中存储美元金额。最好使用的模型字段类型是什么?我需要能够让用户输入这个值(通过错误检查,只想要一个精确到美分的数字),格式化它以输出给不同地方的用户,并用它来计算其他数字。

【问题讨论】:

【参考方案1】:

decimal field 是 货币价值。

它看起来像:

credit = models.DecimalField(max_digits=6, decimal_places=2)

【讨论】:

除非你想代表国债,在这种情况下 max_digits 必须> 20 decimal_places=2 如果您需要它来支持其他货币,则不一定正确。一些货币的小数点后三位,而比特币则高达 8 位。 我认为这个例子几乎适用于所有货币。要将货币表示为比特币,我认为最好使用整数字段将金额保存为 satoshis,然后以您想要的表示形式(BTC、mBTC 等)显示给最终用户 @LieRyan 这是真的。我们必须注意现代类型的“货币”,以防止将来对数据库进行任何修改。使用引号没有任何冒犯。 这个答案***.com/questions/224462/… 建议使用max_digits=19, decimal_place=4 是安全的。【参考方案2】:

其他答案 100% 正确,但不是很实用,因为您仍然需要手动管理输出、格式等。

我建议使用django-money:

from djmoney.models.fields import MoneyField
from django.db import models


def SomeModel(models.Model):
    some_currency = MoneyField(
        decimal_places=2,
        default=0,
        default_currency='USD',
        max_digits=11,
    )

从模板自动工作:

 somemodel.some_currency 

输出:

$123.00

它通过 python-money 拥有强大的后端,它本质上是标准十进制字段的直接替代品。

【讨论】:

(带错误检查,只需要精确到美分的数字),格式化输出给不同地方的用户,用它来计算其他数字。 ,使用DecimalField更实用。我相信它适用于大多数人。正如他们强调的那样,使用django-money,包括货币处理。所以这更适用于涉及交易的项目,如电子商务网站、支付网关、数字货币、银行等...... 我认为,由于他们使用的是美元——一种货币——使用像 django-money (python-money) 这样的货币处理库更有意义,因为它可以完成一切按照您的预期工作,并提供未来的功能调整。最初的问题说他们需要格式化和计算(正如你所引用的那样),为此你最好使用货币库而不是简单的十进制字段。 如果我想添加两个货币字段或做一些计算怎么办? @saran3h 您可以使用货币实例并像任何其他数字(十进制)实例一样执行计算。您可以加/减,乘以整数等。【参考方案3】:
field = models.DecimalField(max_digits=8, decimal_places=2)

请注意,max_digits 应该 >= decimal_places。此示例设置允许的值最大为:999,999.99

文档:https://docs.djangoproject.com/en/1.10/ref/models/fields/#decimalfield

【讨论】:

【参考方案4】:

定义一个小数并在值前返回一个 $ 符号。

    price = models.DecimalField(max_digits=8, decimal_places=2)

    @property
    def price_display(self):
        return "$%s" % self.price

【讨论】:

你确实意识到你刚刚在你的属性中创建了一个无限递归循环,对吧? 有趣。请问那是怎么回事?【参考方案5】:
field = models.DecimalField(max_digits=8, decimal_places=2)

应该为 PostgreSQL 创建一个字段,例如:

 "field" numeric(8, 2) NOT NULL

PostGreSQL 存储美元金额的最佳方式是什么。

如果你需要一个 PostgreSQL 字段类型“双精度”,那么你需要在 django 模型中做:

field = models.FloatField()

【讨论】:

谨防将货币表示为浮点数,因为人们往往会对 w.r.t 的舍入错误感到不满。他们的钱。请参阅:***.com/questions/3730019/… 了解更多详情。

以上是关于用于表示美元金额的最佳 django 模型字段是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将货币金额四舍五入到最接近的镍、四分之一、1 美元、5 美元等面额的最佳方法是啥?

在 Django 中使用更多字段扩展用户模型的最佳方法是啥?

在 django 中为模型创造完整历史的最佳方法是啥?

在数据库 django 中用特殊字符定义特定数字的最佳方法是啥

在现有 Django 应用程序中更改主键的最佳方法是啥?

模型中的 django 星期几表示