Я борюсь с ошибкой DoesNotExist
в моем приложении. Дело в том, что я действительно не понимаю, почему возникает эта ошибка, поскольку я уже обрабатываю ее:
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)
Дело здесь в том, что, когда я сталкиваюсь с этим кодом, у меня есть некий DoesNotExist "уровня модуля", который отбрасывается, как если бы этот блок try / except никогда не попадал:
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.
Похоже, что исключение не ошибка Django, а исключение в shared.models
?
Можете ли вы сделать общее исключение и распечатать print(type(e).__qualname__)
.
Вы ловите django.core.exceptions.ObjectDoesNotExist
, а поднятый - shared.models.DoesNotExist
.
Ага, проблема в том, что я не реализовал shared.models.DoesNotExist. Думаю, это как-то связано с моим @staticmethod
, может быть? В любом случае, я повторно развернул новую версию отладки, содержащую смесь обоих ваших предложений, catch Error as e
и print(type(e).__qualname__)
ничего не выводили
Даже при использовании декоратора @staticmethod
вам все равно придется определять метод с помощью def
. Следовательно, это должен быть def update_some_list(some_list)
. Это просто опечатка в примере?
В самом деле, извините за это, я исправил опечатку и спасибо за это
Итак, после работы с классом журналирования выясняется, что с ObjectDoesNotExist
ошибка отлавливается, и теперь код работает нормально, работая с @classmethod
вместо @staticmethod
.
Рассмотрите возможность использования QuerySet.get_or_create, который устранит указанную выше проблему.
MyClass.objects.get_or_create(name=some_item)
Также обратите внимание, что если вы обращаетесь к классу внутри @staticmethod, имеет смысл обновить его до @classmethod. Кроме того, в вашем вопросе:
from django.db import Models
вместо того из моделей импорта django.db
Извините, я слишком быстро принял ответ. Теперь у меня такая же ошибка, но в функции get_or_create
, мне все еще интересно, что там происходит
@ Йойро странно. Вы можете обрабатывать оба исключения одновременно: except (ObjectDoesNotExist, MyClass.DoesNotExist)
Самая странная часть всего этого заключается в том, что он выдает shared.models.DoesNotExist
, который является моим именем модуля, а не моим классом, так что ... Я действительно не понимаю эту ошибку. Теперь я исправил некоторые другие ошибки (связанные с вызовами внешнего API), и эта больше не отображается, так что ... Не знаю, Python: D
Вы пытались поймать общую ошибку в except и что-то распечатать, чтобы увидеть, перескакивает ли django в предложение except?