Reputation: 2541
I have a problem with this code, it just doesn't want to pass to except
:
try:
tariff = Cost.objects.get(language__name=order.language_destination.name, type__name=order.type.name)
except Cost.DoesNotExist:
tariff = Cost.objects.get(language__name=order.language_source.name, type__name=order.type.name)
else:
pass
Every time it stops at try
and it gives me:
DoesNotExist at /shop/orders/doc/
Cost matching query does not exist.
Any ideea why it's not getting the except code?
Full traceback after adding the else
:
nternal Server Error: /shop/orders/doc/
Traceback (most recent call last):
File "crm/application/agency/views.py", line 156, in order_document
tariff = Cost.objects.get(language__name=order.language_destination.name, type__name=order.type.name)
File "crm/venv/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "crm/venv/lib/python3.5/site-packages/django/db/models/query.py", line 380, in get
self.model._meta.object_name
order.models.DoesNotExist: Cost matching query does not exist.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "crm/venv/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "crm/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "crm/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "crm/venv/lib/python3.5/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "crm/application/agency/views.py", line 165, in order_document
tariff = Cost.objects.get(language__name=order.language_source.name, type__name=order.type.name)
File "crm/venv/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "crm/venv/lib/python3.5/site-packages/django/db/models/query.py", line 380, in get
self.model._meta.object_name
order.models.DoesNotExist: Cost matching query does not exist.
Upvotes: 0
Views: 721
Reputation: 51715
If fails because don't exists any "object" for "destination" neither for "source".
You can rewrite your code like this:
from django.db.models import Q
q1 = Q(language__name=order.language_destination.name)
q2 = Q(language__name=order.language_source.name)
q3 = Q(type__name=order.type.name)
if Cost.objects.filter( q1&q3 ).exists():
tariff = Cost.objects.get( q1&q3 )
elif Cost.objects.filter( q2&q3 ).exists():
tariff = Cost.objects.get( q2&q3 )
else:
*** NOT FOUND ***
But this is just aesthetic changes to avoid exceptions. May be a more elegant and fast approach is using first():
tariff = ( Cost.objects.filter( q1&q3 ).first() or
Cost.objects.filter( q2&q3 ).first()
)
if not tariff:
*** NOT FOUND ***
Upvotes: 1