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

Mik*_*keN 92 django django-models

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

sim*_*rsh 143

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

它看起来像:

credit = models.DecimalField(max_digits=6, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

  • 除非您想代表国家债务,否则max_digits必须> 20 (81认同)
  • 如果您需要这个来支持其他货币,则decimal_places = 2不一定正确.有些货币有三个小数位,比特币有一个百日咳8. (2认同)
  • 我认为这个例子几乎对所有货币都是正确的.要将货币表示为比特币,我认为使用整数字段来保存satoshis中的金额要好得多,然后将其显示给您想要的表示形式中的最终用户(BTC,mBTC等) (2认同)
  • 这个答案/sf/ask/15712371/ precision-and-scale/建议使用“max_digits=19,decimal_place=4”以确保安全。 (2认同)

Lee*_*nde 34

field = models.DecimalField(max_digits=8, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

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

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


Mic*_*son 30

其他答案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,
    )
Run Code Online (Sandbox Code Playgroud)

从模板自动工作:

{{ somemodel.some_currency }}
Run Code Online (Sandbox Code Playgroud)

输出:

$123.00
Run Code Online (Sandbox Code Playgroud)

它有一个强大的后端通过python-money,它实际上是标准十进制字段的替代品.

  • @saran3h 您可以使用货币实例并像任何其他数字(十进制)实例一样执行计算。您可以加/减,乘以整数等。 (2认同)

Çag*_*lan 7

定义小数并在值前面返回$符号.

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

    @property
    def price_display(self):
        return "$%s" % self.price
Run Code Online (Sandbox Code Playgroud)

  • 你确实意识到你刚刚在你的属性中创建了一个无限递归循环,对吗? (5认同)