当我请求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist
。
go = Content.objects.get(name="baby")
怎样才能让go
成为None
而不是DoesNotExist
呢?
发布于 2010-06-22 12:47:10
没有“内置”的方法可以做到这一点。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')
。
发布于 2015-04-05 17:09:36
从Django1.6开始,你可以像这样使用first()方法:
Content.objects.filter(name="baby").first()
发布于 2013-12-19 13:31:09
您可以为此创建一个泛型函数。
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
https://stackoverflow.com/questions/3090302
复制相似问题