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

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    decimal field 是 货币价值。

    它看起来像:

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

    【讨论】:

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

      【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2022-09-23
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2016-06-27
      • 2023-04-10
      相关资源
      最近更新 更多