当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当前回答
为了让事情更简单,下面是我根据这里精彩回复的输入编写的代码片段:
class MyManager(models.Manager):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except ObjectDoesNotExist:
return None
然后在你的模型中
class MyModel(models.Model):
objects = MyManager()
就是这样。 现在你有了MyModel.objects.get()以及mymodel .objects. get_or_none()
其他回答
这是一个讨厌的函数,你可能不想重新实现:
from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")
从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="value") or [None])[0]
我们可以使用Django内置的异常,附加到模型命名为。doesnotexist。因此,我们不需要导入ObjectDoesNotExist异常。
而不是做:
from django.core.exceptions import ObjectDoesNotExist
try:
content = Content.objects.get(name="baby")
except ObjectDoesNotExist:
content = None
我们可以这样做:
try:
content = Content.objects.get(name="baby")
except Content.DoesNotExist:
content = None
我更喜欢这种不使用异常的方法。它既可以处理多个对象,也可以不处理对象。
go_list = Content.objects.filter(name="baby")
if (len(go_list) == 1):
go = go_list[0]
else:
go = None # optionally do other things if there are multiple objects / no objects.