如何导入 Django DoesNotExist 异常?

Posted

技术标签:

【中文标题】如何导入 Django DoesNotExist 异常?【英文标题】:How do I import the Django DoesNotExist exception? 【发布时间】:2012-06-21 23:51:35 【问题描述】:

我正在尝试创建一个 UnitTest 来验证一个对象是否已被删除。

from django.utils import unittest
def test_z_Kallie_can_delete_discussion_response(self):
  ...snip...
  self._driver.get("http://localhost:8000/questions/3/want-a-discussion") 
  self.assertRaises(Answer.DoesNotExist, Answer.objects.get(body__exact = '<p>User can reply to discussion.</p>'))

我不断收到错误:

DoesNotExist: Answer matching query does not exist.

【问题讨论】:

与我下面的答案无关,是 get() 调用删除有问题的答案吗?如果是这样,那真的应该是 DELETE,而不是 GET。 【参考方案1】:

如果您想要一种通用的、独立于模型的方式来捕获异常,您也可以从django.core.exceptions 导入ObjectDoesNotExist

from django.core.exceptions import ObjectDoesNotExist

try:
    SomeModel.objects.get(pk=1)
except ObjectDoesNotExist:
    print 'Does Not Exist!'

【讨论】:

【参考方案2】:

您不需要导入它 - 正如您已经正确编写的那样,DoesNotExist 是模型本身的属性,在本例中为 Answer

您的问题是您在将其传递给assertRaises 之前调用了get 方法——这会引发异常。您需要将参数与可调用对象分开,如unittest documentation 中所述:

self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact='<p>User can reply to discussion.</p>')

或更好:

with self.assertRaises(Answer.DoesNotExist):
    Answer.objects.get(body__exact='<p>User can reply to discussion.</p>')

【讨论】:

好答案,只有上述 sn-ps 中的第一个将被视为无效语法(至少在 Python 2.7 中)。应该是 self.assertRaises(Answer.DoesNotExist, Answer.objects.get, body__exact = '&lt;p&gt;User can reply to discussion.&lt;/p&gt;') - 即添加了 get 的参数作为单独的 kw args,不在 () 内。 啊,当然!我在这里感觉像多萝西。上上下下找,才发现它一直陪着我! Python 3.6 / Django 2.2 只有with 解决方案对我有用。【参考方案3】:

DoesNotExist 始终是不存在的模型属性。在这种情况下,它将是Answer.DoesNotExist

【讨论】:

【参考方案4】:

需要注意的一点是assertRaises 的第二个参数需要 是可调用的——而不仅仅是一个属性。例如,我对这种说法有困难:

self.assertRaises(AP.DoesNotExist, self.fma.ap)

但这很好用:

self.assertRaises(AP.DoesNotExist, lambda: self.fma.ap)

【讨论】:

【参考方案5】:
self.assertFalse(Answer.objects.filter(body__exact='<p>User...discussion.</p>').exists())

【讨论】:

这并不能完全按照要求回答问题。但它仍然是一个不错的解决方案,提供了一种不同的方法来获得所需的结果。【参考方案6】:

这就是我进行此类测试的方式。

from foo.models import Answer

def test_z_Kallie_can_delete_discussion_response(self):

  ...snip...

  self._driver.get("http://localhost:8000/questions/3/want-a-discussion") 
  try:
      answer = Answer.objects.get(body__exact = '<p>User can reply to discussion.</p>'))      
      self.fail("Should not have reached here! Expected no Answer object. Found %s" % answer
  except Answer.DoesNotExist:
      pass # all is as expected

【讨论】:

以上是关于如何导入 Django DoesNotExist 异常?的主要内容,如果未能解决你的问题,请参考以下文章

Django 迁移失败并显示“__fake__.DoesNotExist:权限匹配查询不存在”。

Django celery 任务:新创建的模型 DoesNotExist

Django blog.models.Post.DoesNotExist:帖子匹配查询不存在

如何通过ajax Django发布复选框数据?

django在读取数据库时未筛选到符合条件的记录会报错

操作错误:致命:数据库“django”不存在