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