在Django中如何获取存在的对象,或获取不存在时的None?
当我请求模型管理器获取一个对象时,如果没有找到匹配的对象,它会抛出一个叫做 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')
。