当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当前回答
没有例外:
if SomeModel.objects.filter(foo='bar').exists():
x = SomeModel.objects.get(foo='bar')
else:
x = None
使用异常:
try:
x = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
x = None
关于在python中什么时候应该使用异常有一点争论。一方面,“请求原谅比请求允许容易”。虽然我同意这一点,但我认为应该保留一个异常,好吧,异常,并且“理想情况”应该运行而不碰到异常。
其他回答
从django 1.6开始,你可以像这样使用first()方法:
Content.objects.filter(name="baby").first()
这是一个讨厌的函数,你可能不想重新实现:
from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")
这是Django get_object_or_404方法的一个副本,只是该方法返回None。当我们必须使用only()查询来只检索某些字段时,这是非常有用的。该方法可以接受模型或查询集。
from django.shortcuts import _get_queryset
def get_object_or_none(klass, *args, **kwargs):
"""
Use get() to return an object, or return None if object
does not exist.
klass may be a Model, Manager, or QuerySet object. All other passed
arguments and keyword arguments are used in the get() query.
Like with QuerySet.get(), MultipleObjectsReturned is raised if more than
one object is found.
"""
queryset = _get_queryset(klass)
if not hasattr(queryset, 'get'):
klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
raise ValueError(
"First argument to get_object_or_none() must be a Model, Manager, "
"or QuerySet, not '%s'." % klass__name
)
try:
return queryset.get(*args, **kwargs)
except queryset.model.DoesNotExist:
return None
我们可以使用Django内置的异常,附加到模型命名为。doesnotexist。因此,我们不需要导入ObjectDoesNotExist异常。
而不是做:
from django.core.exceptions import ObjectDoesNotExist
try:
content = Content.objects.get(name="baby")
except ObjectDoesNotExist:
content = None
我们可以这样做:
try:
content = Content.objects.get(name="baby")
except Content.DoesNotExist:
content = None
我认为使用get_object_or_404()是个不错的主意。
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
这个例子等价于:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
你可以在django在线文档中阅读更多关于get_object_or_404()的信息。