当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当前回答
来一片怎么样?它将解析到限制1。
go = Content.objects.filter(name="baby")[0]
其他回答
没有“内置”的方法可以做到这一点。Django每次都会抛出DoesNotExist异常。 在python中,处理这个问题的惯用方法是将其封装在try catch中:
try:
go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
go = None
我所做的就是将模型子类化。Manager,创建一个类似于上面代码的safe_get,并将该Manager用于我的模型。这样你就可以写:sommodel .objects.safe_get(foo='bar')。
从django 1.6开始,你可以像这样使用first()方法:
Content.objects.filter(name="baby").first()
如果发生这样的事呢?
go = (Content.objects.filter(name="value") or [None])[0]
您可以为此创建一个通用函数。
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