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

TIM*_*MEX 44 python django

每当我这样做:

thepost = Content.objects.get(name="test")
Run Code Online (Sandbox Code Playgroud)

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

Som*_*ude 74

try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None
Run Code Online (Sandbox Code Playgroud)

使用模型DoesNotExist异常

  • 在这种情况下,异常是`Content.DoesNotExist`,如果你想要继续,即使找不到对象(即不像我的例子中那样抛出404错误),这个代码结构也很有用. (9认同)

Rob*_*ing 26

通常,直接使用Django快捷方式函数get_object_or_404而不是API 更有用:

from django.shortcuts import get_object_or_404

thepost = get_object_or_404(Content, name='test')
Run Code Online (Sandbox Code Playgroud)

很明显,如果无法找到对象,这将抛出404错误,如果成功,您的代码将继续.


小智 15

您还可以捕获通用的DoesNotExist.根据http://docs.djangoproject.com/en/dev/ref/models/querysets/上的文档

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."
Run Code Online (Sandbox Code Playgroud)


小智 9

另一种写作方式:

try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None
Run Code Online (Sandbox Code Playgroud)

很简单:

thepost = Content.objects.filter(name="test").first()
Run Code Online (Sandbox Code Playgroud)

请注意,两者并不完全相同.get如果没有您要查询的记录,以及找到多条记录时,Manager方法不仅会引发异常.使用first多个记录时,可能会通过返回第一条记录来静默地使业务逻辑失败.


Anu*_*yal 7

抓住例外

try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None
Run Code Online (Sandbox Code Playgroud)

或者你可以过滤,如果没有匹配,它将返回一个空列表

posts = Content.objects.filter(name="test")
if posts:
    # do something with posts[0] and see if you want to raise error if post > 1
Run Code Online (Sandbox Code Playgroud)

  • @mrmuggles Python社区拥抱EAFP,更容易要求宽恕而不是权限.这种风格在标准库和必须使用的大型Python第三方库中得到广泛应用.这是一篇关于这个主题的随机博客文章:https://www.jeffknupp.com/blog/2013/02/06/write-cleaner-python-use-exceptions/ (2认同)