Django在try/except中使用DoesNotExist仍将抛出它

3

我在应用程序中遇到了一个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
看起来异常并不是Django的错误,而是shared.models中的异常? - Willem Van Onsem
你能否做一个全局的例外处理,然后打印出 print(type(e).__qualname__) - Willem Van Onsem
1
你正在捕获 django.core.exceptions.ObjectDoesNotExist,但实际上抛出的是 shared.models.DoesNotExist - Tryph
问题在于我没有实现 shared.models.DoesNotExist。可能与我的 @staticmethod 有关?无论如何,我重新部署了一个新的调试版本,其中包含了你们两个提议的混合体,catch Error as eprint(type(e).__qualname__) 都没有输出任何内容。 - Yoiro
显示剩余3条评论
1个回答

1
考虑使用QuerySet.get_or_create,这将消除上述问题。
MyClass.objects.get_or_create(name=some_item)

此外,请注意,如果您在 @staticmethod 内部访问类,则更新为 @classmethod 是有意义的。另外,在你提出的问题中:
from django.db import Models

替代方式: from django.db import models


抱歉,我太快地接受了答案。现在我在 get_or_create 函数中遇到了相同的错误,仍然想知道其中发生了什么。 - Yoiro
@Yoiro,很奇怪。您可以同时处理这两个异常:except (ObjectDoesNotExist, MyClass.DoesNotExist) - Andriy Ivaneyko
在所有这些中最奇怪的部分是它抛出了一个 shared.models.DoesNotExist,这是我的模块名称而不是我的类,所以...我真的不理解这个错误。现在我已经纠正了一些其他错误(与外部API调用有关),这个错误不再显示了,所以...不知道,Python :D - Yoiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接