每当我这样做时:
thepost = Content.objects.get(name="test")
当找不到任何内容时,它总是会抛出错误。 我该如何处理?
答案 0 :(得分:67)
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
使用模型DoesNotExist异常
答案 1 :(得分:22)
通常,直接使用Django快捷键函数get_object_or_404
代替API更有用:
from django.shortcuts import get_object_or_404
thepost = get_object_or_404(Content, name='test')
显然,如果无法找到该对象,则会抛出404错误,如果成功,您的代码将会继续。
答案 2 :(得分:15)
您还可以捕获通用的DoesNotExist。根据{{3}}
的文档from django.core.exceptions import ObjectDoesNotExist
try:
e = Entry.objects.get(id=3)
b = Blog.objects.get(id=1)
except ObjectDoesNotExist:
print "Either the entry or blog doesn't exist."
答案 3 :(得分:9)
另一种写作方式:
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
简单地说:
thepost = Content.objects.filter(name="test").first()
请注意,两者并不完全相同。管理员方法get
不仅会引发您正在查询的没有记录的情况下的异常,而且会在找到多条记录时引发异常。当有多个记录时使用first
可能会通过返回第一条记录来静默地使您的业务逻辑失败。
答案 4 :(得分:7)
抓住例外
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
或者你可以过滤,如果没有匹配则会返回一个空列表
posts = Content.objects.filter(name="test")
if posts:
# do something with posts[0] and see if you want to raise error if post > 1
答案 5 :(得分:2)
在视图中的不同点处理异常真的很麻烦。在models.py文件中定义自定义模型管理器,如
class ContentManager(model.Manager):
def get_nicely(self, **kwargs):
try:
return self.get(kwargs)
except(KeyError, Content.DoesNotExist):
return None
然后将其包含在内容Model类
中class Content(model.Model):
...
objects = ContentManager()
通过这种方式,可以很容易地在视图中处理,即
post = Content.objects.get_nicely(pk = 1)
if post != None:
# Do something
else:
# This post doesn't exist
答案 6 :(得分:1)
提升Http404 exception效果很好:
from django.http import Http404
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
return render_to_response('polls/detail.html', {'poll': p})
答案 7 :(得分:0)
基本上有两种方法可以执行此操作。第一种方法比较冗长,因为它不使用任何shortcuts
:
from django.http import Http404
from .models import Content
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
raise Http404("Content does not exist")
现在,由于这种操作(即获取对象或在不存在时提高404)在Web开发中非常普遍,因此Django提供了名为get_object_or_404
的快捷方式,该快捷方式将get()
请求的对象或提高Http404
(如果找不到):
from django.shortcuts import get_object_or_404
from .models import Content
thepost = get_object_or_404(Content, name="test")
对于对象列表,同样可以使用get_list_or_404()
函数,该函数使用filter()
而不是get()
,并且如果返回的列表为空,则Http404
将是提出。