Django 知识库:get_object_or_404()获取资源

4716 views, 2020/05/09 updated   Go to Comments

从模型中取出某个特定内容,最简单的方式就是用模型管理器的 get() 方法了:

obj = SomeModel.objects.get(id=1)

像上面的代码,如果数据库中没有 id=1 的数据条目时,Django 会抛出 Error 500 错误。但问题是大部分时候,没有相关条目仅仅是因为资源不存在,应该抛出万恶的 Error 404 才对。

因此就有了 get_object_or_404()

obj = get_object_or_404(SomeModel, id=1)

它其实就是下面这种写法的快捷方式:

try:
    obj = SomeModel.objects.get(id=1)
except SomeModel.DoesNotExist:
    raise Http404("No SomeModel matches the given query.")

除了上面这种最常用的写法, get_object_or_404() 还可以接受 queryset 作为第一个参数:

queryset = Post.objects.filter(title__startswith='V')
post = get_object_or_404(queryset, id=id)

当你需要把查询集反复筛选、传递时,这种写法还是很有用的。

最后还要注意, get_object_or_404()get() 一样,只能返回单个结果,否则服务器将抛出错误。

get_object_or_404() 还可以接受管理器作为参数,有兴趣请去官方文档了解。

那要是我想获取多个结果呢?请用get_list_or_404()

objs = get_list_or_404(SomeModel, isMale=True)

它类似于如下代码:

objs = list(SomeModel.objects.filter(isMale=True))
if not objs:
    raise Http404("No SomeModel matches the given query.")

用之前别忘了导入它们:

from django.shortcuts import get_object_or_404
from django.shortcuts import get_list_or_404



本文作者: 杜赛
发布时间: 2020年05月09日 - 16:58
最后更新: 2020年05月09日 - 16:58
转载请保留原文链接及作者