ChatGPT解决这个技术问题 Extra ChatGPT

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

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


u
user8193706

decimal field 是货币价值的正确选择。

它看起来像:

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

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

其他答案是 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,包括 Currency 处理。所以这更适用于涉及交易的项目,如电子商务网站、支付网关、数字货币、银行等......
我认为,由于他们正在使用美元——一种货币——使用像 django-money (python-money) 这样的货币处理库更有意义,因为它可以让一切按你的预期工作并提供未来的功能调整。最初的问题说他们需要格式化和计算(正如你所引用的),为此你最好使用货币库而不是简单的十进制字段。
如果我想添加两个货币字段或进行一些计算怎么办?
@saran3h 您可以使用货币实例并像任何其他数字(十进制)实例一样执行计算。您可以加/减,乘以整数等。
L
Lee Hinde
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


J
J__

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

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

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

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

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

 "field" numeric(8, 2) NOT NULL

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

如果您需要 PostgreSQL 字段类型“双精度”,那么您需要在 django 模型中执行:

field = models.FloatField()

谨防将钱表示为浮点数,因为人们往往会对钱的舍入错误感到不满。有关详细信息,请参阅:stackoverflow.com/questions/3730019/…