如何导入 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 = '<p>User can reply to discussion.</p>')
- 即添加了 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