当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是None代替?
当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发DoesNotExist。
go = Content.objects.get(name="baby")
而不是DoesNotExist,我怎么能去是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()
其他回答
这是一个讨厌的函数,你可能不想重新实现:
from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")
您可以为此创建一个通用函数。
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
你可以这样做:
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
在视图的不同位置处理异常可能真的很麻烦..在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
我认为使用get_object_or_404()是个不错的主意。
from django.shortcuts import get_object_or_404
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
这个例子等价于:
from django.http import Http404
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
你可以在django在线文档中阅读更多关于get_object_or_404()的信息。