处理Django对象的最佳方法是什么?

时间:2010-12-04 10:50:09

标签: python django

每当我这样做时:

thepost = Content.objects.get(name="test")

当找不到任何内容时,它总是会抛出错误。 我该如何处理?

8 个答案:

答案 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将是提出。