ABD doları tutarını temsil etmek için kullanılacak en iyi django modeli alanı nedir?


104

Django modelinin bir alanında ABD doları tutarında bir miktar depolamam gerekiyor. Kullanılacak en iyi model alan türü nedir? Kullanıcının bu değeri girmesini sağlamalı (hata kontrolüyle, yalnızca sentlere göre doğru bir sayı istiyorum), farklı yerlerdeki kullanıcılara çıktı vermek için biçimlendirmem ve diğer sayıları hesaplamak için kullanabilmem gerekiyor.

Yanıtlar:


168

Bir ondalık alan para birimi değeri için doğru seçimdir.

Şunun gibi görünecek:

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

104
Ulusal borcu temsil etmek istemiyorsanız, bu durumda max_digits> 20 olmalıdır
Bron Davies

4
Diğer para birimlerini desteklemek için buna ihtiyacınız varsa ondalık_yer = 2 mutlaka doğru değildir. Bazı para birimlerinin üç ondalık basamağı vardır ve Bitcoin'de boğmaca 8'dir.
Lie Ryan

2
Bu örneğin neredeyse tüm para birimleri için doğru olduğunu düşünüyorum. Para birimlerini Bitcoin olarak temsil etmek için, miktarı satoshis olarak kaydetmek için bir tamsayı alanı kullanmak ve daha sonra bunu istediğiniz gösterimde (BTC, mBTC, vb.) Son kullanıcıya göstermek çok daha iyidir
jion

Venezuela'nın ulusal borcunu Venezuela'nın ulusal para birimi cinsinden temsil etmek istemiyorsanız, bu durumda 21 maksimum basamak gerekir
Luis Sieira

@LieRyan bu doğru. Gelecekte herhangi bir db değişikliğini önlemek için modern "para birimi" türlerine dikkat etmeliyiz. Alıntıların kullanımına alınma.
ENCHANCE


35

Diğer yanıtlar% 100 doğrudur ancak yine de çıktıyı, biçimlendirmeyi vb. Manuel olarak yönetmeniz gerekeceği için pek pratik değildir.

Django-money kullanmanızı öneririm :

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,
    )

Şablonlardan otomatik olarak çalışır:

{{ somemodel.some_currency }}

Çıktı:

$123.00

Python-money aracılığıyla güçlü bir arka uca sahiptir ve esasen standart ondalık alanlar için bir drop-in yerine geçer.


(hata denetimi ile, yalnızca sentlere göre doğru bir sayı isteyin), farklı yerlerdeki kullanıcılara çıktı vermek için biçimlendirin ve diğer sayıları hesaplamak için kullanın. Bu tür durumlarda kullanım DecimalFielddaha pratiktir. Ve çoğu insan için uygulandığına inanıyorum. django-moneyVurgulandıkları gibi kullanarak Para Birimi işlemeyi ekleyin . Yani bu daha çok e-ticaret siteleri, ödeme ağ geçidi, dijital para birimi, bankacılık vb. Gibi işlemleri içeren projeler için.
Yeo

Bir para birimi olan USD ile çalıştıkları için django-money (python-money) gibi bir para birimi işleme kitaplığı kullanmanın daha mantıklı olduğunu, çünkü her şeyin beklediğiniz ve karşıladığınız gibi çalışmasını sağladığını iddia ediyorum. gelecekteki özellik ayarlamaları. Orijinal soru, biçimlendirme ve hesaplamaya ihtiyaç duyduklarını söylüyor (alıntı yaptığınız gibi) ve bunun için basit bir ondalık alan yerine bir para birimi kitaplığı kullanmanız daha iyi.
Michael Thompson

1
Ya iki para alanı eklemek istersem veya bazı hesaplamalar yaparsam?
saran3h

1
@ saran3h para örnekleriyle çalışabilir ve diğer herhangi bir sayı (ondalık) örneği gibi hesaplamalar yapabilirsiniz. Toplama / çıkarma, tamsayılarla çarpma, vb. Yapabilirsiniz
Michael Thompson

9

Bir ondalık tanımlayın ve değerin önüne bir $ işareti döndürün.

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

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

6
Mülkünüzde sonsuz bir özyineleme döngüsü oluşturduğunuzun farkındasınız, değil mi?
El Ninja Trepador

İlginç. Nasıl olduğunu sorabilir miyim?
kingraphaii

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

PostgreSQL için aşağıdaki gibi bir alan oluşturmalısınız:

 "field" numeric(8, 2) NOT NULL

PostGreSQL için depolanan ABD doları tutarının en iyi yolu budur.

Bir PostgreSQL alan türüne "çift duyarlıklı" ihtiyacınız varsa, django modelinde yapmanız gerekir:

field = models.FloatField()

3
İnsanlar paralarını yuvarlama hatalarından memnun olmadıklarından, parayı kayan nokta sayısı olarak göstermekten kaçının. Daha fazla ayrıntı için bkz. Stackoverflow.com/questions/3730019/… .
Adam Parkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.