当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当前回答
来自django docs
如果没有找到给定参数的对象,get()将引发一个DoesNotExist异常。这个异常也是模型类的一个属性。DoesNotExist异常继承自django.core.exceptions.ObjectDoesNotExist
您可以捕获异常并将None指定为go。
from django.core.exceptions import ObjectDoesNotExist
try:
go = Content.objects.get(name="baby")
except ObjectDoesNotExist:
go = None
其他回答
从django 1.7开始,你可以这样做:
class MyQuerySet(models.QuerySet):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except self.model.DoesNotExist:
return None
class MyBaseModel(models.Model):
objects = MyQuerySet.as_manager()
class MyModel(MyBaseModel):
...
class AnotherMyModel(MyBaseModel):
...
“MyQuerySet.as_manager()”的优点是以下两个都可以工作:
MyModel.objects.filter(...).get_or_none()
MyModel.objects.get_or_none()
你可以这样做:
go = Content.objects.filter(name="baby").first()
现在,go变量可以是你想要的对象,也可以是None
裁判:https://docs.djangoproject.com/en/1.8/ref/models/querysets/ # django.db.models.query.QuerySet.first
如果发生这样的事呢?
go = (Content.objects.filter(name="value") or [None])[0]
Maybe更好用:
User.objects.filter(username=admin_username).exists()
如果你想要一个简单的单行解决方案,不涉及异常处理、条件语句或Django 1.6+的要求,可以这样做:
x = next(iter(SomeModel.objects.filter(foo='bar')), None)