2009-07-16 13 views
59

Necesito almacenar un monto de $ EE.UU. En dólares en un campo de un modelo de Django. ¿Cuál es el mejor tipo de campo modelo para usar? Necesito poder hacer que el usuario ingrese este valor (con verificación de errores, solo quiero un número exacto en centavos), formateelo para enviarlo a usuarios en diferentes lugares y utilícelo para calcular otros números.¿Cuál es el mejor campo de modelo de Django para representar una cantidad en dólares estadounidenses?

Respuesta

95

A decimal field es la elección correcta para el valor de la moneda .

Se verá algo como:

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

A menos que desee representar la deuda nacional, en cuyo caso max_digits tiene que ser> 20 –

+0

decimal_places = 2 no es necesariamente correcto si necesita esto para admitir otras monedas. Algunas monedas tienen tres decimales, y Bitcoin tiene un whooping 8. –

+0

Creo que este ejemplo es correcto para casi todas las monedas. Para representar monedas como Bitcoin, creo que es mucho mejor usar un campo entero para guardar la cantidad en satoshis, y luego mostrarlo al usuario final en la representación que desee (BTC, mBTC, etc.) – jion

7

Definir un decimal y devolver un signo $ delante del valor.

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

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

. Se da cuenta de que acaba de crear un ciclo de recursión infinita en su propiedad, ¿verdad? –

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

debe crear condiciones para PostgreSQL como:

"field" numeric(8, 2) NOT NULL 

¿Cuál es la mejor manera de cantidad en dólares de EE.UU. PostGreSQL almacenado.

Si necesita un tipo de campo PostgreSQL "doble precisión", entonces necesita hacer en modelo de Django:

field = models.FloatField() 
17

Las otras respuestas son 100% correcta, pero no son muy prácticos ya que todavía tendrá para gestionar manualmente la salida, el formato, etc.

se recomienda usar 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, 
    ) 

funciona de forma automática a partir de plantillas:

{{ somemodel.some_currency }} 

Salida:

$123.00 

Cuenta con un motor de gran alcance a través de pitón de dinero y que es esencialmente una gota en el reemplazo para los campos decimales estándar.

+0

* (con comprobación de errores, solo quiere un número exacto en céntimos), formatéelo para que se emita a usuarios en diferentes lugares y utilícelo para calcular otros números. * Para tales casos, use 'DecimalField' es más práctico. Y creo que se aplica a la mayoría de las personas. Utilizando 'django-money' como se destacó, incluye ** manejo de moneda **.Así que esto es más para proyectos que involucran transacciones como sitios de comercio electrónico, pasarela de pago, moneda digital, banca, etc. – Yeo

+0

Argumentaría que, dado que están trabajando con USD, una moneda, tiene más sentido utilice una biblioteca de manejo de divisas como django-money (python-money) ya que hace que todo funcione como usted espera y permite ajustes de funciones futuros. La pregunta original dice que necesitan formato y cálculo (como lo citó) y para eso es mejor utilizar una biblioteca de divisas en lugar de un simple campo decimal. –

Cuestiones relacionadas