Django try / except on doesnotexist все еще бросает его

Я борюсь с ошибкой 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.

Вы пытались поймать общую ошибку в except и что-то распечатать, чтобы увидеть, перескакивает ли django в предложение except?

Andrey Bulezyuk 10.09.2018 11:31

Похоже, что исключение не ошибка Django, а исключение в shared.models?

Willem Van Onsem 10.09.2018 11:31

Можете ли вы сделать общее исключение и распечатать print(type(e).__qualname__).

Willem Van Onsem 10.09.2018 11:31

Вы ловите django.core.exceptions.ObjectDoesNotExist, а поднятый - shared.models.DoesNotExist.

Tryph 10.09.2018 11:36

Ага, проблема в том, что я не реализовал shared.models.DoesNotExist. Думаю, это как-то связано с моим @staticmethod, может быть? В любом случае, я повторно развернул новую версию отладки, содержащую смесь обоих ваших предложений, catch Error as e и print(type(e).__qualname__) ничего не выводили

Yoiro 10.09.2018 11:43

Даже при использовании декоратора @staticmethod вам все равно придется определять метод с помощью def. Следовательно, это должен быть def update_some_list(some_list). Это просто опечатка в примере?

cezar 10.09.2018 12:24

В самом деле, извините за это, я исправил опечатку и спасибо за это

Yoiro 10.09.2018 12:27

Итак, после работы с классом журналирования выясняется, что с ObjectDoesNotExist ошибка отлавливается, и теперь код работает нормально, работая с @classmethod вместо @staticmethod.

Yoiro 10.09.2018 12:39
3
8
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрите возможность использования QuerySet.get_or_create, который устранит указанную выше проблему.

MyClass.objects.get_or_create(name=some_item)

Также обратите внимание, что если вы обращаетесь к классу внутри @staticmethod, имеет смысл обновить его до @classmethod. Кроме того, в вашем вопросе:

from django.db import Models

вместо того из моделей импорта django.db

Извините, я слишком быстро принял ответ. Теперь у меня такая же ошибка, но в функции get_or_create, мне все еще интересно, что там происходит

Yoiro 10.09.2018 15:16

@ Йойро странно. Вы можете обрабатывать оба исключения одновременно: except (ObjectDoesNotExist, MyClass.DoesNotExist)

Andriy Ivaneyko 10.09.2018 15:59

Самая странная часть всего этого заключается в том, что он выдает shared.models.DoesNotExist, который является моим именем модуля, а не моим классом, так что ... Я действительно не понимаю эту ошибку. Теперь я исправил некоторые другие ошибки (связанные с вызовами внешнего API), и эта больше не отображается, так что ... Не знаю, Python: D

Yoiro 10.09.2018 16:44

Другие вопросы по теме