我需要在Django模型的字段中存储美元$
金额。最好的模型字段类型是什么?我需要让用户输入这个值(进行错误检查,只想要精确到分的数字),将其格式化以在不同位置向用户输出,并用它来计算其他数字。
我需要在Django模型的字段中存储美元$
金额。最好的模型字段类型是什么?我需要让用户输入这个值(进行错误检查,只想要精确到分的数字),将其格式化以在不同位置向用户输出,并用它来计算其他数字。
其他答案都是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拥有强大的后端,并且本质上是标准小数字段的即插即用替代品。
DecimalField
更实用。我相信大多数人都会使用它。正如它们所强调的那样,使用django-money
,包括货币处理。因此,这更适用于涉及交易的项目,例如电子商务网站、支付网关、数字货币、银行等... - Yeofield = models.DecimalField(max_digits=8, decimal_places=2)
price = models.DecimalField(max_digits=8, decimal_places=2)
@property
def price_display(self):
return "$%s" % self.price
field = models.DecimalField(max_digits=8, decimal_places=2)
"field" numeric(8, 2) NOT NULL
如何在PostGreSQL中存储美元金额?
如果您需要一个PostgreSQL字段类型“double precision”,那么您需要在django模型中进行以下操作:
field = models.FloatField()
money
字段:django-money[exchange]
:pip install django-money[exchange]
django-money
,但是它没有转换货币的功能,所以我建议按照上面的方式安装django-money[exchange]
:pip install django-money
# "core/settings.py"
INSTALLED_APPS = [
...,
'djmoney.contrib.exchange',
]
python manage.py migrate
MoneyField()
、MinMoneyValidator()
、MaxMoneyValidator()
和Decimal定义一个字段,如下所示:# "my_app/models.py"
from djmoney.models.fields import MoneyField
from decimal import Decimal
from djmoney.models.validators import MaxMoneyValidator, MinMoneyValidator
class MyModel(models.Model):
money = MoneyField(
max_digits=5, decimal_places=2, default=0, default_currency='USD',
validators=[
MinMoneyValidator(Decimal(0.00)), MaxMoneyValidator(Decimal(999.99)),
]
)
python manage.py makemigrations && python manage.py migrate
$
获取带有$
的值,并在my_app/views.py
中使用.amount
获取不带$
的值,如下所示:# "my_app/views.py"
from django.http import HttpResponse
from app.models import MyModel
def test(request):
print(MyModel.objects.all()[0].money) # Here
print(MyModel.objects.all()[0].money.amount) # Here
return HttpResponse("Test")
$12.54
12.54
接下来,您可以将 12.54 USD
转换为 ... EUR
。
首先,打开Open Exchange Rates,然后注册以获取货币的汇率:
然后,从您的仪表板复制应用程序ID: 然后,在core/settings.py
中使用App ID设置OPEN_EXCHANGE_RATES_APP_ID
:# "core/settings.py"
# Here
OPEN_EXCHANGE_RATES_APP_ID = '368183b0b2644e999ef2a61bd38d0ca3'
python manage.py update_rates
convert_money()
和Money()
将12.54 USD
转换为... EUR
。*您必须使用不带$
的值,使用.amount
:# "my_app/views.py"
from django.http import HttpResponse
from app.models import MyModel
from djmoney.contrib.exchange.models import convert_money
from djmoney.money import Money
def test(request):
money = MyModel.objects.all()[0].money.amount
print(convert_money(Money(money, 'USD'), 'EUR')) # Here
return HttpResponse("Test")
12.54美元
被转换为11.70欧元
如下所示:€11.70
你可以查看更详细的信息,请参阅django-money文档。
此外,你可以使用core/tasks.py
和core/settings.py
中的celery beat代码每60分钟更新货币的汇率。*Open Exchange Rates在免费计划中每月可接受1000个请求:
# "core/tasks.py"
from celery import shared_task
from djmoney import settings
from django.utils.module_loading import import_string
@shared_task
def update_rates(app_id):
backend = import_string(settings.EXCHANGE_BACKEND)(
access_key=app_id
)
backend.update_rates()
print("Successfully updated")
*您应将 OPEN_EXCHANGE_RATES_APP_ID
放在 settings.py
中的 celery beat 代码之前,并导入 app
、crontab
和 update_rates
,如下所示:
# "core/settings.py"
OPEN_EXCHANGE_RATES_APP_ID = '368183b0b2644e999ef2a61bd38d0ca3'
from .celery import app
from celery.schedules import crontab
from .tasks import update_rates
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(
crontab(minute='*/60'),
update_rates.s(OPEN_EXCHANGE_RATES_APP_ID),
name='update_rates'
)