alex
alex

Reputation: 2541

Django object matching query does not exist

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

Answers (1)

dani herrera
dani herrera

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

Related Questions