Yoiro
Yoiro

Reputation: 352

Django try/except on DoesNotExist still throws it

I'm struggling with a DoesNotExist error on my application. The point is that I don't really understand why this error is thrown as I already handle it:

import socket

from django.core.exceptions import ObjectDoesNotExist
from django.db import Models

class MyClass(models.Model):
    name = models.CharField(max_length=250, default=socket.gethostname(), unique=True)
    @staticmethod
    def update_some_list(some_list):
        for some_item in some_list:
            try:
                MyClass.objects.get(name=some_item)
            except ObjectDoesNotExist:  # I also tried with MyClass.DoesNotExist
                MyClass.objects.create(name=some_item)

The point here is that, when I run into this code, I have some "module-level" DoesNotExist that is thrown away, as if this try/except block is never hit:

Traceback (most recent call last):
  File "/app/backend/shared/models.py", line 201, in update_some_list
    MyClass.objects.get(name=some_item)
  File "/usr/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/django/db/models/query.py", line 399, in get
    self.model._meta.object_name
shared.models.DoesNotExist: MyClass matching query does not exist.

Upvotes: 3

Views: 647

Answers (1)

Andriy Ivaneyko
Andriy Ivaneyko

Reputation: 22041

Consider using QuerySet.get_or_create, which shall eliminate the problem above.

MyClass.objects.get_or_create(name=some_item)

Also, please note, that if you access class inside the @staticmethod it makes sense to update it to be @classmethod. Also, in the question you are having:

from django.db import Models

instead of from django.db import models

Upvotes: 1

Related Questions