当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。

go = Content.objects.get(name="baby")

而不是DoesNotExist,我怎么能去是None代替?


当前回答

如果你想要一个简单的单行解决方案,不涉及异常处理、条件语句或Django 1.6+的要求,可以这样做:

x = next(iter(SomeModel.objects.filter(foo='bar')), None)

其他回答

从django 1.6开始,你可以像这样使用first()方法:

Content.objects.filter(name="baby").first()

我认为使用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()的信息。

来自django docs

如果没有找到给定参数的对象,get()将引发一个DoesNotExist异常。这个异常也是模型类的一个属性。DoesNotExist异常继承自django.core.exceptions.ObjectDoesNotExist

您可以捕获异常并将None指定为go。

from django.core.exceptions import ObjectDoesNotExist
try:
    go  = Content.objects.get(name="baby")
except ObjectDoesNotExist:
    go = None

我也面临着同样的问题。编写和读取try是很困难的——除非你想从模型中获取一个元素,比如@Arthur Debert的回答。因此,我的解决方案是创建一个由模型继承的Getter类:

class Getter:
    @classmethod
    def try_to_get(cls, *args, **kwargs):
        try:
            return cls.objects.get(**kwargs)
        except Exception as e:
            return None

class MyActualModel(models.Model, Getter):
    pk_id = models.AutoField(primary_key=True)
    ...

通过这种方式,我可以得到MyActualModel或None的实际元素:

MyActualModel.try_to_get(pk_id=1)

如果你想要一个简单的单行解决方案,不涉及异常处理、条件语句或Django 1.6+的要求,可以这样做:

x = next(iter(SomeModel.objects.filter(foo='bar')), None)