在Django中如何获取存在的对象,或获取不存在时的None?

395 投票
24 回答
366117 浏览
提问于 2025-04-16 00:16

当我请求模型管理器获取一个对象时,如果没有找到匹配的对象,它会抛出一个叫做 DoesNotExist 的错误。

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

我想知道,能不能让它返回 None,而不是抛出 DoesNotExist 的错误呢?

24 个回答

61

你可以为这个创建一个通用的函数。

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,否则会返回内容条目。

注意:如果有多个条目匹配 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
326

从Django 1.6版本开始,你可以这样使用 first() 方法:

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

没有“内置”的方法可以做到这一点。每次你这样做时,Django都会抛出一个DoesNotExist的异常。

在Python中,处理这种情况的常用方法是把它放在一个try-catch块里:

try:
    go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
    go = None

我做的是,继承models.Manager,创建一个像上面那样的safe_get方法,并把这个管理器用于我的模型。这样你就可以写:SomeModel.objects.safe_get(foo='bar')

撰写回答