首页 > 解决方案 > 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.

标签: pythondjango

解决方案


考虑使用QuerySet.get_or_create,这将消除上述问题。

MyClass.objects.get_or_create(name=some_item)

另外,请注意,如果您访问 @staticmethod 中的类,则将其更新为@classmethod是有意义的。另外,在您遇到的问题中:

from django.db import Models

而不是从 django.db 导入模型


推荐阅读