详解Django的 get_object_or_404() 函数:获取模型对象或返回 404 错误

  • Post category:Python

get_object_or_404()是Django框架中常见的一个函数。它有很多用途,但最常见的是它可以在一个对象不存在的情况下抛出一个HTTP 404错误,而不是抛出Python的DoesNotExist异常。这个函数可以在视图函数、模板中使用。

作用

Django的get_object_or_404()的作用是在数据库中根据查询条件获取一个对象,如果没有找到该对象则抛出404异常。这个函数的作用范围不仅局限于获取单个对象,还可以在查询集中使用它来获取多个对象。这个函数可以代替编写诸如try…except…代码块来捕获ObjectDoesNotExist异常并显示404页面的代码。

使用攻略

get_object_or_404()函数的使用方法如下:

from django.shortcuts import render, get_object_or_404
from .models import Article

def article_detail(request, id):
    article = get_object_or_404(Article, id=id)
    return render(request, 'article_detail.html', {'article': article})

这里的get_object_or_404()函数尝试从Article模型中获取一个ID为id的文章。如果找不到该文章,则会抛出一个HTTP 404错误。在上例中,我们使用函数的第一个参数来传递模型类,第二个参数是关键字参数,表示需要查找的特定对象的标识符。

这种方式在检索单个对象时很有用,但如果我们要获取多个对象,则可以使用同样的方式来查询集:

def article_list(request):
    articles = Article.objects.all()
    return render(request, 'article_list.html', {'articles': articles})

在这个例子中,我们使用查询集Article.objects.all()获取了所有文章,然后将其传递给模板。如果查询集返回了0个文章,则会抛出404异常。

实例说明

现在我们来看两个实例来说明get_object_or_404()函数的使用:

实例1

假设我们有一个名为Blog的模型,并且我们想要检索它的第一个文章。我们可以这样做:

from django.shortcuts import get_object_or_404
from .models import Blog

def first_blog(request):
    blog = get_object_or_404(Blog, id=1)
    return render(request, 'blog_detail.html', {'blog': blog})

这个例子中,get_object_or_404()将尝试检索ID为1的Blog对象。如果找不到该对象,则会抛出HTTP 404异常。

实例2

假设我们有一个名为Comment的模型,每个评论都和一个文章相关联。我们想要检索特定文章的所有评论。我们可以这样做:

from django.shortcuts import get_object_or_404
from .models import Article, Comment

def article_comments(request, article_id):
    article = get_object_or_404(Article, id=article_id)
    comments = Comment.objects.filter(article=article)
    return render(request, 'article_comments.html', {'article': article, 'comments': comments})

在这个例子中,我们使用get_object_or_404()函数检索ID为article_idArticle对象。如果Article对象不存在,则会引发HTTP 404错误。我们然后使用这个Article对象来过滤使用Comment.objects.filter()方法找到的所有相关评论。即使“评论”对象为空,也不会抛出404异常,因为错误只会在get_object_or_404()函数的调用中发生。