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

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

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


当前回答

您可以为此创建一个通用函数。

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.DoesNotExist:
        return None

如下所示:

go = get_or_none(Content,name="baby")

如果没有匹配的条目,go将为None,否则将返回Content条目。

注意:如果name="baby"返回了多个条目,将引发异常MultipleObjectsReturned。

你应该在数据模型上处理它以避免这种错误,但你可能更喜欢在运行时像这样记录它:

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.MultipleObjectsReturned as e:
        print('ERR====>', e)

    except classmodel.DoesNotExist:
        return None

其他回答

在视图的不同位置处理异常可能真的很麻烦..在models.py文件中定义一个自定义模型管理器怎么样

class ContentManager(model.Manager):
    def get_nicely(self, **kwargs):
        try:
            return self.get(kwargs)
        except(KeyError, Content.DoesNotExist):
            return None

然后将其包含在内容Model类中

class Content(model.Model):
    ...
    objects = ContentManager()

通过这种方式,它可以很容易地在视图中处理。

post = Content.objects.get_nicely(pk = 1)
if post:
    # Do something
else:
    # This post doesn't exist

我更喜欢这种不使用异常的方法。它既可以处理多个对象,也可以不处理对象。

go_list = Content.objects.filter(name="baby")
if (len(go_list) == 1):
    go = go_list[0]
else:
    go = None # optionally do other things if there are multiple objects / no objects.

您可以为此创建一个通用函数。

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.DoesNotExist:
        return None

如下所示:

go = get_or_none(Content,name="baby")

如果没有匹配的条目,go将为None,否则将返回Content条目。

注意:如果name="baby"返回了多个条目,将引发异常MultipleObjectsReturned。

你应该在数据模型上处理它以避免这种错误,但你可能更喜欢在运行时像这样记录它:

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.MultipleObjectsReturned as e:
        print('ERR====>', e)

    except classmodel.DoesNotExist:
        return None

如果发生这样的事呢?

go = (Content.objects.filter(name="value") or [None])[0]

没有例外:

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中什么时候应该使用异常有一点争论。一方面,“请求原谅比请求允许容易”。虽然我同意这一点,但我认为应该保留一个异常,好吧,异常,并且“理想情况”应该运行而不碰到异常。