首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果对象存在,如何获取;如果Django中不存在,如何获取?

如果对象存在,如何获取;如果Django中不存在,如何获取?
EN

Stack Overflow用户
提问于 2010-06-22 12:38:42
回答 17查看 260.5K关注 0票数 303

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

代码语言:javascript
复制
go = Content.objects.get(name="baby")

怎样才能让go成为None而不是DoesNotExist呢?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-06-22 12:47:10

没有“内置”的方法可以做到这一点。Django每次都会引发DoesNotExist异常。在python中处理此问题的惯用方法是将其包装在try catch中:

代码语言:javascript
复制
try:
    go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
    go = None

我所做的就是将models.Manager子类化,创建一个类似上面代码的safe_get,并将该管理器用于我的模型。这样你就可以编写:SomeModel.objects.safe_get(foo='bar')

票数 424
EN

Stack Overflow用户

发布于 2015-04-05 17:09:36

从Django1.6开始,你可以像这样使用first()方法:

代码语言:javascript
复制
Content.objects.filter(name="baby").first()
票数 251
EN

Stack Overflow用户

发布于 2013-12-19 13:31:09

您可以为此创建一个泛型函数。

代码语言:javascript
复制
def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.DoesNotExist:
        return None

如下所示:

代码语言:javascript
复制
go = get_or_none(Content,name="baby")

如果没有匹配的条目返回内容条目,则go将为None

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

您应该在数据模型上处理它,以避免此类错误,但您可能更喜欢在运行时记录它,如下所示:

代码语言:javascript
复制
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
票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3090302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档