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


103

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

Answers:


166

一个小数领域是货币价值的正确选择。

它看起来像:

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

98
除非您想代表国家债务,否则max_digits必须大于20
Bron Davies

4
如果您需要它来支持其他货币,则decimal_places = 2不一定正确。一些货币有三位小数,而比特币有百日咳8
李瑞安

2
我认为这个例子几乎对所有货币都是正确的。为了将货币表示为比特币,我认为最好使用整数字段将金额保存为satoshis,然后以所需的表示形式(BTC,mBTC等)将其显示给最终用户
jion

除非您想以委内瑞拉的本国货币表示委内瑞拉的国债,否则您需要21个max_digits
Luis Sieira

@LieRyan是的。我们必须注意“ currency”的现代类型,以防止将来进行任何数据库修改。使用引号没有违法行为。
enchance


35

其他答案是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)之类的货币处理库更有意义,因为它可以使一切正常工作并按您的期望提供将来的功能调整。最初的问题是,他们需要格式化和计算(如您所引用的),因此最好使用货币库而不是简单的十进制字段。
Michael Thompson

1
如果我想添加两个金钱字段或进行一些计算该怎么办?
saran3h '18

1
@ saran3h,您可以使用money实例并像其他任何数字(十进制)实例一样执行计算。您可以通过整数,等加/减,乘
迈克尔·汤普森

8

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

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

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

6
您确实意识到您刚刚在属性中创建了一个无限递归循环,对吗?
El Ninja Trepador '18

有趣。请问这是怎么回事?
kingraphaii

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

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

 "field" numeric(8, 2) NOT NULL

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

如果需要PostgreSQL字段类型“双精度”,则需要在Django模型中执行:

field = models.FloatField()

3
当心人们将钱表示为浮点数,因为人们倾向于对舍入错误而浪费金钱。有关更多详细信息,请参见:stackoverflow.com/questions/3730019/…
亚当·帕金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.