当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是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
其他回答
Maybe更好用:
User.objects.filter(username=admin_username).exists()
如果你想要一个简单的单行解决方案,不涉及异常处理、条件语句或Django 1.6+的要求,可以这样做:
x = next(iter(SomeModel.objects.filter(foo='bar')), None)
来一片怎么样?它将解析到限制1。
go = Content.objects.filter(name="baby")[0]
没有例外:
if SomeModel.objects.filter(foo='bar').exists():
x = SomeModel.objects.get(foo='bar')
else:
x = None
使用异常:
try:
x = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
x = None
关于在python中什么时候应该使用异常有一点争论。一方面,“请求原谅比请求允许容易”。虽然我同意这一点,但我认为应该保留一个异常,好吧,异常,并且“理想情况”应该运行而不碰到异常。
在视图的不同位置处理异常可能真的很麻烦..在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