米ドル金額を表すために使用するのに最適なdjangoモデルフィールドは何ですか?


103

Djangoモデルのフィールドに米ドルの金額を保存する必要があります。使用するのに最適なモデルフィールドタイプは何ですか?ユーザーにこの値を入力させ(エラーチェックを行い、正確な数値のみをセントにしたい)、さまざまな場所のユーザーに出力できるようにフォーマットし、他の数値の計算に使用できるようにする必要があります。

回答:


166

小数フィールドは、通貨価値のための正しい選択です。

次のようになります。

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

98
国の負債を表す場合を除き、max_digitsは20より大きくする必要があります
Bron Davies

4
decimal_places = 2は、他の通貨をサポートするためにこれが必要な場合、必ずしも正しいとは限りません。一部の通貨は3小数点以下の桁数を持ち、ビットコインは百日咳8を持っている
リー・ライアン

2
この例はほとんどすべての通貨に当てはまると思います。ビットコインと通貨を表現するために、私はより良いsatoshisの量を保存して、あなたは(BTC、MBTC、など)したいことを表現における最終的なユーザーにそれを表示するには整数フィールドを使用するのだと思う
jion

ベネズエラの国の債務でベネズエラの国債を表す場合を除いて、21のmax_digitsが必要です
Luis Sieira

@LieRyanほんとだ 今後のdbの変更を防ぐために、現代のタイプの「通貨」に注意する必要があります。引用符を使用しても問題ありません。
強化


35

他の答えは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を介した強力なバックエンドがあり、基本的に標準の10進数フィールドのドロップイン置換です。


(エラーチェックを使用して、セントに正確な数値のみが必要です)、異なる場所のユーザーに出力するためにフォーマットし、他の数値を計算するために使用します。そのような場合には、使用DecimalFieldがより実用的です。そして、私はそれがほとんどの人に適用されると信じています。django-money彼らが強調したように使用して、通貨処理を含めます。これは、複数のそのようななどのeコマースサイト、支払いゲートウェイ、デジタル通貨、銀行、....等の取引に関わるプロジェクトのためになるように

彼らはUSD(通貨)を使用しているので、django-money(python-money)のような通貨処理ライブラリを使用する方が理にかなっていると思います。将来の機能調整。元の質問では、(引用したように)書式設定と計算が必要であり、そのためには単純な10進数フィールドの代わりに通貨ライブラリを使用した方がよいと述べています。
Michael Thompson

1
2つのMoneyフィールドを追加したり、計算をしたい場合はどうなりますか?
saran3h

1
@ saran3hマネーインスタンスを使用して、他の数値(10進数)インスタンスと同様に計算を実行できます。加算/減算、整数による乗算などができます
Michael Thompson

8

小数を定義し、値の前に$記号を返します。

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

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

6
あなたはあなたのプロパティに無限の再帰ループを作成したことを知っていますか?
El Ninja Trepador 2018

面白い。どうですか?
kingraphaii

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

次のようなPostgreSQLのフィールドを作成する必要があります。

 "field" numeric(8, 2) NOT NULL

PostGreSQLに保存された米ドル金額を保存するのに最適な方法です。

PostgreSQLのフィールドタイプ「倍精度」が必要な場合は、djangoモデルで行う必要があります。

field = models.FloatField()

3
お金は丸め誤差に不満を感じる傾向があるため、お金を浮動小数点数で表すことに注意してください。詳細については、stackoverflow.com / questions / 3730019 / を参照してください。
Adam Parkin、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.