Python 如何解决Django中的丢失率错误?

Python 如何解决Django中的丢失率错误?,python,django,Python,Django,我想在Django应用程序中转换货币。我创建了一个模型客户。在客户模型中,有两个字段用于信用额度和货币选择。我用django货币兑换。但我有一个错误: 丢失率/客户 汇率英镑->美元不存在 我怎样才能解决它 视图.py from djmoney.money import Money from djmoney.contrib.exchange.models import convert_money def customer(request): form_class = NewCustome

我想在Django应用程序中转换货币。我创建了一个模型
客户
。在客户模型中,有两个字段用于
信用额度
货币选择
。我用django货币兑换。但我有一个错误:

丢失率/客户 汇率英镑->美元不存在

我怎样才能解决它

视图.py

from djmoney.money import Money
from djmoney.contrib.exchange.models import convert_money
def customer(request):
    form_class = NewCustomerForm
    current_user = request.user
    userP = UserProfile.objects.get_or_create(username=current_user)
    company = userP[0].company
    if request.method == 'POST':
        form = NewCustomerForm(request.POST)
        if form.is_valid():
            newCustomer = form.save()
            newCustomer.company = company
            selected_currency = newCustomer.currency_choice
            selected_limit = newCustomer.credit_limit
            value = Money(selected_limit, selected_currency)
            converted = convert_money(value, 'USD')
            print(converted)
            newCustomer.save()
            return redirect('user:customer_list')
    else:
        form = form_class()

    return render(request, 'customer.html', {'form': form})
class Customer(models.Model):
...

    CURRENCIES = [
        ('USD', 'USD'),
        ('EUR', 'EUR'),
        ('GBP', 'GBP'),
    ]
...
    credit_limit = models.FloatField(default=0)
    currency_choice = models.TextField(max_length=50, default='Select', choices=CURRENCIES)
...

INSTALLED_APPS = [
   ...,
   'djmoney',
   ...
]
...
EXCHANGE_BACKEND = 'djmoney.contrib.exchange.backends.FixerBackend'
CURRENCIES = ('USD', 'EUR', 'GBP')
OPEN_EXCHANGE_RATES_URL = 'https://openexchangerates.org/api/historical/2017-01-01.json?symbols=EUR,NOK,SEK,CZK,USD,GBP'
FIXER_URL = 'http://data.fixer.io/api/2013-12-24?symbols=EUR,NOK,GBP,SEK,CZK,USD,GBP'
型号.py

from djmoney.money import Money
from djmoney.contrib.exchange.models import convert_money
def customer(request):
    form_class = NewCustomerForm
    current_user = request.user
    userP = UserProfile.objects.get_or_create(username=current_user)
    company = userP[0].company
    if request.method == 'POST':
        form = NewCustomerForm(request.POST)
        if form.is_valid():
            newCustomer = form.save()
            newCustomer.company = company
            selected_currency = newCustomer.currency_choice
            selected_limit = newCustomer.credit_limit
            value = Money(selected_limit, selected_currency)
            converted = convert_money(value, 'USD')
            print(converted)
            newCustomer.save()
            return redirect('user:customer_list')
    else:
        form = form_class()

    return render(request, 'customer.html', {'form': form})
class Customer(models.Model):
...

    CURRENCIES = [
        ('USD', 'USD'),
        ('EUR', 'EUR'),
        ('GBP', 'GBP'),
    ]
...
    credit_limit = models.FloatField(default=0)
    currency_choice = models.TextField(max_length=50, default='Select', choices=CURRENCIES)
...

INSTALLED_APPS = [
   ...,
   'djmoney',
   ...
]
...
EXCHANGE_BACKEND = 'djmoney.contrib.exchange.backends.FixerBackend'
CURRENCIES = ('USD', 'EUR', 'GBP')
OPEN_EXCHANGE_RATES_URL = 'https://openexchangerates.org/api/historical/2017-01-01.json?symbols=EUR,NOK,SEK,CZK,USD,GBP'
FIXER_URL = 'http://data.fixer.io/api/2013-12-24?symbols=EUR,NOK,GBP,SEK,CZK,USD,GBP'
设置.py

from djmoney.money import Money
from djmoney.contrib.exchange.models import convert_money
def customer(request):
    form_class = NewCustomerForm
    current_user = request.user
    userP = UserProfile.objects.get_or_create(username=current_user)
    company = userP[0].company
    if request.method == 'POST':
        form = NewCustomerForm(request.POST)
        if form.is_valid():
            newCustomer = form.save()
            newCustomer.company = company
            selected_currency = newCustomer.currency_choice
            selected_limit = newCustomer.credit_limit
            value = Money(selected_limit, selected_currency)
            converted = convert_money(value, 'USD')
            print(converted)
            newCustomer.save()
            return redirect('user:customer_list')
    else:
        form = form_class()

    return render(request, 'customer.html', {'form': form})
class Customer(models.Model):
...

    CURRENCIES = [
        ('USD', 'USD'),
        ('EUR', 'EUR'),
        ('GBP', 'GBP'),
    ]
...
    credit_limit = models.FloatField(default=0)
    currency_choice = models.TextField(max_length=50, default='Select', choices=CURRENCIES)
...

INSTALLED_APPS = [
   ...,
   'djmoney',
   ...
]
...
EXCHANGE_BACKEND = 'djmoney.contrib.exchange.backends.FixerBackend'
CURRENCIES = ('USD', 'EUR', 'GBP')
OPEN_EXCHANGE_RATES_URL = 'https://openexchangerates.org/api/historical/2017-01-01.json?symbols=EUR,NOK,SEK,CZK,USD,GBP'
FIXER_URL = 'http://data.fixer.io/api/2013-12-24?symbols=EUR,NOK,GBP,SEK,CZK,USD,GBP'
回溯

   Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/customer

Django Version: 3.1.4
Python Version: 3.8.8
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'register',
 'customer',
 'financial_analysis',
 'ocr',
 'core',
 'approvals',
 'crispy_forms',
 'ckeditor',
 'rest_framework',
 'requests',
 'ckeditor_uploader',
 'django_filters',
 'activity_log',
 'djmoney',
 'djmoney.contrib.exchange']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\USER\OneDrive\Documents\GitHub\otc\myvenv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\USER\OneDrive\Documents\GitHub\otc\myvenv\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\USER\OneDrive\Documents\GitHub\otc\customer\views.py", line 27, in customer
    newCustomer.usd_credit_limit = convert_money(Money(selected_limit, selected_currency), 'USD')
  File "C:\Users\USER\OneDrive\Documents\GitHub\otc\myvenv\lib\site-packages\djmoney\contrib\exchange\models.py", line 108, in convert_money
    amount = value.amount * get_rate(value.currency, currency)
  File "C:\Users\USER\OneDrive\Documents\GitHub\otc\myvenv\lib\site-packages\djmoney\contrib\exchange\models.py", line 49, in get_rate
    result = _get_rate(source, target, backend)
  File "C:\Users\USER\OneDrive\Documents\GitHub\otc\myvenv\lib\site-packages\djmoney\contrib\exchange\models.py", line 60, in _get_rate
    raise MissingRate("Rate %s -> %s does not exist" % (source, target))

Exception Type: MissingRate at /customer
Exception Value: Rate BGN -> USD does not exist

我快速地看了一下引起异常的代码。如果您仔细看一下第60行:

这就是提出的错误。在上面的两行中,您可以看到触发此错误的查询集:

rates = Rate.objects.filter(currency__in=(source, target), backend=backend).select_related("backend")
然后,我注意到有一个管理命令可以创建这些速率对象:

您似乎可以使用以下命令:

./manage.py update_rates
这有用吗