Яке найкраще поле моделі джанго використовувати для представлення суми в доларах США?


103

Мені потрібно зберігати суму в доларі США у полі моделі Джанго. Який найкращий тип модельного поля використовувати? Мені потрібно мати можливість ввести це значення (при перевірці помилок, лише хочу, щоб число було точно в центах), відформатувати його для виведення для користувачів у різних місцях і використовувати його для обчислення інших чисел.

Відповіді:


166

Поле десяткового є правильним вибором для вартості валюти.

Це буде виглядати приблизно так:

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

98
Якщо ви не хочете представляти державний борг, в такому випадку max_digits повинен бути> 20
Bron Davies

4
decimal_places = 2 не обов'язково правильний, якщо вам це потрібно для підтримки інших валют. Деякі валюти містять три десяткових знаки, а у біткойна - коклюш 8.
Лейте Раян

2
Я думаю, що цей приклад є правильним майже для всіх валют. Щоб представити валюти як біткойн, я думаю, що набагато краще використовувати ціле поле, щоб зберегти суму в сатоші, а потім показати її кінцевому користувачеві в потрібному поданні (BTC, mBTC тощо)
jion

Якщо ви не хочете представляти державний борг Венесуели, в національній валюті Венесуела, і в цьому випадку вам потрібно 21 max_digits
Луїс Сієра

@LieRyan це правда. Ми повинні взяти до відома сучасні типи "валюти", щоб запобігти будь-яким майбутнім модифікаціям db. Без образи за використання цитат.
чарувати


35

Інші відповіді на 100% вірні, але не дуже практичні, оскільки вам доведеться вручну керувати результатами, форматуванням тощо.

Я б запропонував використовувати гроші з джанго :

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-гроші і, по суті, це заміна, що випадає для стандартних десяткових полів.


(при перевірці помилок потрібно лише вказати число з точністю до центів), відформатуйте його для виведення користувачам у різних місцях та використовуйте його для обчислення інших чисел. Для таких випадків використання DecimalFieldбільш практичне. І я вважаю, що це застосовується для більшості людей. Використовуйте, django-moneyяк вони підкреслили, включайте обробку валюти . Тож це більше стосується проектів, пов’язаних із транзакціями, такими як сайти електронної комерції, шлюз платежів, цифрова валюта, банківська справа тощо.
Yeo

Я б заперечував, що оскільки вони працюють з доларом США - валютою - має сенс використовувати бібліотеку, що обробляє валюту, як django-гроші (python-money), оскільки це робить все так, як ви очікували і пропонуєте. майбутні корективи функції. Оригінальне запитання говорить, що вони потребують форматування та обчислення (як ви цитували), і для цього вам краще використовувати бібліотеку валют замість простого десяткового поля.
Майкл Томпсон

1
Що робити, якщо я хочу додати два грошових поля або зробити деякі розрахунки?
saran3h

1
@ saran3h ви можете працювати з грошовими екземплярами і виконувати обчислення, як і будь-який інший екземпляр числа (десятковий). Ви можете додавати / віднімати, помножувати на цілі числа тощо.
Майкл Томпсон,

8

Визначте десятковий знак і поверніть знак $ перед значенням.

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

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

6
Ви розумієте, що ви щойно створили нескінченний цикл рекурсії у вашій власності, правда?
El Ninja Trepador

Цікаво. Чи можу я запитати, як це?
kingraphaii

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

Потрібно створити поле для PostgreSQL на зразок:

 "field" numeric(8, 2) NOT NULL

Який найкращий спосіб для збереженої в PostGreSQL суми в доларах США.

Якщо вам потрібне поле PostgreSQL типу "подвійна точність", тоді вам потрібно зробити в моделі джанго:

field = models.FloatField()

3
Остерігайтеся представляти гроші як число з плаваючою комою, оскільки люди, як правило, незадоволені помилками округлення wrt своїх грошей. Дивіться: stackoverflow.com/questions/3730019/… для більш детальної інформації.
Адам Паркін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.