【发布时间】:2010-11-11 11:35:12
【问题描述】:
我需要在 Django 模型的字段中存储美元金额。最好使用的模型字段类型是什么?我需要能够让用户输入这个值(通过错误检查,只想要一个精确到美分的数字),格式化它以输出给不同地方的用户,并用它来计算其他数字。
【问题讨论】:
标签: django django-models
我需要在 Django 模型的字段中存储美元金额。最好使用的模型字段类型是什么?我需要能够让用户输入这个值(通过错误检查,只想要一个精确到美分的数字),格式化它以输出给不同地方的用户,并用它来计算其他数字。
【问题讨论】:
标签: django django-models
【讨论】:
max_digits=19, decimal_place=4 是安全的。
其他答案 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,包括货币处理。所以这更适用于涉及交易的项目,如电子商务网站、支付网关、数字货币、银行等......
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
【讨论】:
定义一个小数并在值前返回一个 $ 符号。
price = models.DecimalField(max_digits=8, decimal_places=2)
@property
def price_display(self):
return "$%s" % self.price
【讨论】:
field = models.DecimalField(max_digits=8, decimal_places=2)
应该为 PostgreSQL 创建一个字段,例如:
"field" numeric(8, 2) NOT NULL
PostGreSQL 存储美元金额的最佳方式是什么。
如果你需要一个 PostgreSQL 字段类型“双精度”,那么你需要在 django 模型中做:
field = models.FloatField()
【讨论】: