I want to convert currencies in my Django app. I created a model Customer
. In customer model, there are two fields for that credit_limit
and currency_choice
. I am using django-money for conversion. But I get an error:
MissingRate at /customer Rate GBP -> USD does not exist
How can I solve it?
views.py:
JavaScript
x
24
24
1
from djmoney.money import Money
2
from djmoney.contrib.exchange.models import convert_money
3
def customer(request):
4
form_class = NewCustomerForm
5
current_user = request.user
6
userP = UserProfile.objects.get_or_create(username=current_user)
7
company = userP[0].company
8
if request.method == 'POST':
9
form = NewCustomerForm(request.POST)
10
if form.is_valid():
11
newCustomer = form.save()
12
newCustomer.company = company
13
selected_currency = newCustomer.currency_choice
14
selected_limit = newCustomer.credit_limit
15
value = Money(selected_limit, selected_currency)
16
converted = convert_money(value, 'USD')
17
print(converted)
18
newCustomer.save()
19
return redirect('user:customer_list')
20
else:
21
form = form_class()
22
23
return render(request, 'customer.html', {'form': form})
24
models.py:
JavaScript
1
12
12
1
class Customer(models.Model):
2
3
4
CURRENCIES = [
5
('USD', 'USD'),
6
('EUR', 'EUR'),
7
('GBP', 'GBP'),
8
]
9
10
credit_limit = models.FloatField(default=0)
11
currency_choice = models.TextField(max_length=50, default='Select', choices=CURRENCIES)
12
settings.py:
JavaScript
1
13
13
1
2
3
INSTALLED_APPS = [
4
,
5
'djmoney',
6
7
]
8
9
EXCHANGE_BACKEND = 'djmoney.contrib.exchange.backends.FixerBackend'
10
CURRENCIES = ('USD', 'EUR', 'GBP')
11
OPEN_EXCHANGE_RATES_URL = 'https://openexchangerates.org/api/historical/2017-01-01.json?symbols=EUR,NOK,SEK,CZK,USD,GBP'
12
FIXER_URL = 'http://data.fixer.io/api/2013-12-24?symbols=EUR,NOK,GBP,SEK,CZK,USD,GBP'
13
traceback:
JavaScript
1
59
59
1
Environment:
2
3
4
Request Method: POST
5
Request URL: http://127.0.0.1:8000/customer
6
7
Django Version: 3.1.4
8
Python Version: 3.8.8
9
Installed Applications:
10
['django.contrib.admin',
11
'django.contrib.auth',
12
'django.contrib.contenttypes',
13
'django.contrib.sessions',
14
'django.contrib.messages',
15
'django.contrib.staticfiles',
16
'django.contrib.humanize',
17
'register',
18
'customer',
19
'financial_analysis',
20
'ocr',
21
'core',
22
'approvals',
23
'crispy_forms',
24
'ckeditor',
25
'rest_framework',
26
'requests',
27
'ckeditor_uploader',
28
'django_filters',
29
'activity_log',
30
'djmoney',
31
'djmoney.contrib.exchange']
32
Installed Middleware:
33
['django.middleware.security.SecurityMiddleware',
34
'django.contrib.sessions.middleware.SessionMiddleware',
35
'django.middleware.common.CommonMiddleware',
36
'django.middleware.csrf.CsrfViewMiddleware',
37
'django.contrib.auth.middleware.AuthenticationMiddleware',
38
'django.contrib.messages.middleware.MessageMiddleware',
39
'django.middleware.clickjacking.XFrameOptionsMiddleware']
40
41
42
43
Traceback (most recent call last):
44
File "C:UsersUSEROneDriveDocumentsGitHubotcmyvenvlibsite-packagesdjangocorehandlersexception.py", line 47, in inner
45
response = get_response(request)
46
File "C:UsersUSEROneDriveDocumentsGitHubotcmyvenvlibsite-packagesdjangocorehandlersbase.py", line 179, in _get_response
47
response = wrapped_callback(request, *callback_args, **callback_kwargs)
48
File "C:UsersUSEROneDriveDocumentsGitHubotccustomerviews.py", line 27, in customer
49
newCustomer.usd_credit_limit = convert_money(Money(selected_limit, selected_currency), 'USD')
50
File "C:UsersUSEROneDriveDocumentsGitHubotcmyvenvlibsite-packagesdjmoneycontribexchangemodels.py", line 108, in convert_money
51
amount = value.amount * get_rate(value.currency, currency)
52
File "C:UsersUSEROneDriveDocumentsGitHubotcmyvenvlibsite-packagesdjmoneycontribexchangemodels.py", line 49, in get_rate
53
result = _get_rate(source, target, backend)
54
File "C:UsersUSEROneDriveDocumentsGitHubotcmyvenvlibsite-packagesdjmoneycontribexchangemodels.py", line 60, in _get_rate
55
raise MissingRate("Rate %s -> %s does not exist" % (source, target))
56
57
Exception Type: MissingRate at /customer
58
Exception Value: Rate BGN -> USD does not exist
59
Advertisement
Answer
I took a quick look at the code that’s rising exceptions. If you take a closer look at line 60 here:
that’s the error that’s being raised. 2 lines above you can see a queryset that triggers this error:
JavaScript
1
2
1
rates = Rate.objects.filter(currency__in=(source, target), backend=backend).select_related("backend")
2
I have then noticed that there’s a management command that creates these Rate objects:
it seems that you can use the following command:
JavaScript
1
2
1
./manage.py update_rates
2
does this help?