I need to store a U.S. $ dollar amount in a field of a Django model. What is the best model field type to use? I need to be able to have the user enter this value (with error checking, only want a number accurate to cents), format it for output to users in different places, and use it to calculate other numbers.
A decimal field is the right choice for the currency value.
It will look something like:
credit = models.DecimalField(max_digits=6, decimal_places=2)
The other answers are 100% right but aren't very practical as you'll still have to manually manage output, formatting etc.
I would suggest using 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,
)
Works automatically from templates:
{{ somemodel.some_currency }}
Output:
$123.00
It has a powerful backend via python-money and it's essentially a drop-in replacement for standard decimal fields.
DecimalField
is more practical. And I believe it is applied for most people. Using django-money
as they highlighted, include Currency handling. So this is more for project involving transaction such as ecommerce sites, payment gateway, digital currency, banking, etc....
field = models.DecimalField(max_digits=8, decimal_places=2)
Note that max_digits should be >= decimal_places. This example setting would allow a value up to: 999,999.99
Docs: https://docs.djangoproject.com/en/1.10/ref/models/fields/#decimalfield
Define a decimal and return a $ sign in front of the value.
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)
Should create a field for PostgreSQL like:
"field" numeric(8, 2) NOT NULL
Which is the best way for PostGreSQL stored US dollar amount.
If you need a PostgreSQL field type "double precision", then you need do in django model:
field = models.FloatField()
Success story sharing
max_digits=19, decimal_place=4
to be safe.