2009-07-16 12 views
59

Potrzebuję przechowywać kwotę w dolarach amerykańskich w polu modelu Django. Jaki jest najlepszy typ pola modelu, którego należy użyć? Muszę mieć możliwość podania przez użytkownika tej wartości (przy sprawdzaniu błędów, potrzebna jest tylko liczba dokładna do centów), sformatowania jej na potrzeby użytkowników w różnych miejscach i użycia jej do obliczenia innych liczb.Jakie jest najlepsze pole modelu django, które można wykorzystać do reprezentowania kwoty w dolarach amerykańskich?

Odpowiedz

95

A decimal field jest właściwym wyborem dla wartości waluty .

To będzie wyglądać następująco:

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

Jeśli nie chcesz reprezentować długu publicznego, w którym to przypadku max_digits musi być> 20 –

+0

decimal_places = 2 niekoniecznie jest poprawne, jeśli potrzebujesz tego do obsługi innych walut. Niektóre waluty mają trzy miejsca dziesiętne, a Bitcoin ma koklusz 8. –

+0

Myślę, że ten przykład jest poprawny prawie we wszystkich walutach. Aby reprezentować waluty jako Bitcoin, myślę, że lepiej jest użyć pola liczby całkowitej, aby zapisać kwotę w satoshis, a następnie pokazać je użytkownikowi końcowemu w reprezentacji, którą chcesz (BTC, mBTC itp.). – jion

7

Zdefiniuj po przecinku i zwraca znak $ przed wartością.

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

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

Zdajesz sobie sprawę, że właśnie stworzyłem nieskończoną pętlę rekursji w twojej nieruchomości, prawda? –

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

powinno stworzyć pole dla PostgreSQL jak:

"field" numeric(8, 2) NOT NULL 

Jaki jest najlepszy sposób dla PostgreSQL przechowywane amerykańskiego dolara kwoty.

Jeśli potrzebujesz typ pola PostgreSQL „podwójnej precyzji”, to trzeba zrobić w modelu django:

field = models.FloatField() 
17

innych odpowiedzi są w 100% rację, ale nie są bardzo praktyczne, jak wciąż masz ręcznie zarządzać wyjście, formatowanie itp

Sugerowałbym użyciu 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, 
    ) 

działa automatycznie z szablonów:

{{ somemodel.some_currency }} 

wyjściowa:

$123.00 

Ma potężny backend za pośrednictwem Python-money i jest to w istocie zastąpienie drop-in dla standardowych pól dziesiętnych.

+0

* (przy sprawdzaniu błędów, chcemy tylko liczby dokładnej do centów), sformatuj ją dla danych wyjściowych dla użytkowników w różnych miejscach i użyj jej do obliczenia innych liczb. * W takich przypadkach użycie 'DecimalField' jest bardziej praktyczne. I uważam, że jest stosowana dla większości ludzi. Użycie 'django-money' podświetlonych, obejmuje obsługę ** Waluta **.A więc bardziej dotyczy to projektu obejmującego transakcje, takie jak strony e-commerce, bramka płatności, cyfrowa waluta, bankowość itp. – Yeo

+0

Twierdzę, że skoro pracują z USD - waluta - bardziej sensowne jest korzystaj z biblioteki obsługi walut, takiej jak django-money (pieniądze-pytony), ponieważ wszystko działa zgodnie z oczekiwaniami i zapewnia przyszłe dostosowania funkcji. Pierwotne pytanie mówi, że wymaga formatowania i obliczeń (jak zacytowałeś), a do tego lepiej użyć biblioteki walut zamiast prostego pola dziesiętnego. –

Powiązane problemy