当我要求模型管理器获取一个对象时,当没有匹配的对象时,它会引发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
其他回答
你可以在过滤器中使用exists:
Content.objects.filter(name="baby").exists()
#returns False or True depending on if there is anything in the QS
如果你只想知道它是否存在,这是另一种选择
您可以为此创建一个通用函数。
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
我使用的是Django 2.2.16。这就是我解决这个问题的方法:
from typing import Any
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
from django.db.models.base import ModelBase
from django.db.models.manager import Manager
class SManager(Manager):
def get_if_exist(self, *args: Any, **kwargs: Any):
try:
return self.get(*args, **kwargs)
except ObjectDoesNotExist:
return None
class SModelBase(ModelBase):
def _prepare(cls):
manager = SManager()
manager.auto_created = True
cls.add_to_class("objects", manager)
super()._prepare()
class Meta:
abstract = True
class SModel(models.Model, metaclass=SModelBase):
managers = False
class Meta:
abstract = True
之后,在每个模型中,你只需要导入:
from custom.models import SModel
class SUser(SModel):
pass
在视图中,你可以这样调用:
SUser.objects.get_if_exist(id=1)
我们可以使用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
我认为使用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()的信息。