django报错self.DoesNotExist("%s matching query does not exist." % self.__class__._meta.object_name)怎么办
发布时间:2023-04-04 07:16:01
在Django中,当使用模型管理器获取单个对象并且没有找到时,会抛出`self.DoesNotExist`异常。这可能是因为提供了错误的查询条件或者该对象根本不存在。如何解决可以使用 try-except 语句捕获此异常并执行必要的操作。如果找不到这个对象,则会抛出 DoesNotExist 异常,并将 my_object 设为 None。之后将 my_object 传递给模板并在模板中进行处理这样就能在my_object不存在的时候规避错误并处理这种情况了。
报错的原因
这个错误通常是因为在数据库中没有找到与查询匹配的对象。在Django中,当使用模型管理器(如objects)获取单个对象并且没有找到时,会抛出`self.DoesNotExist`异常。这可能是因为提供了错误的查询条件或者该对象根本不存在。
如何解决
可以使用 try-except 语句捕获此异常并执行必要的操作。例如,你可以在获取对象时使用 get() 方法,该方法在找不到对象时会抛出`self.DoesNotExist`异常,而不是使用 filter() 或者其它的查询方法。
from django.shortcuts import render
from .models import MyModel
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
my_object = None
return render(request, 'my_template.html', {'my_object': my_object})
或者针对与它相关的异常处理。
from django.shortcuts import render
from django.core.exceptions import ObjectDoesNotExist
from .models import MyModel
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except ObjectDoesNotExist:
my_object = None
return render(request, 'my_template.html', {'my_object': my_object})
也可以捕获所有异常
from django.shortcuts import render
from .models import MyModel
def my_view(request):
try:
my_object = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist as e:
my_object = None
except Exception as e:
my_object = None
return render(request, 'my_template.html', {'my_object': my_object})
再或者直接用 get_object_or_404() 来直接替代。这个函数会在对象不存在的时候抛出 Http404 异常。
from django.shortcuts import get_object_or_404, render
from .models import MyModel
def my_view(request):
my_object = get_object_or_404(MyModel, pk=1)
return render(request, 'my_template.html', {'my_object': my_object})
使用例子
是的,下面是一个使用 try-except 语句捕获 DoesNotExist 异常并执行必要操作的例子。这个例子是在视图函数中使用,但它同样适用于其它地方,如模型类的方法中。
from django.shortcuts import render
from .models import MyModel
def my_view(request):
try:
my_object = MyModel.objects.get(name='John')
except MyModel.DoesNotExist:
my_object = None
return render(request, 'my_template.html', {'my_object': my_object})
在这个例子中,在视图函数中使用了 MyModel 的 objects 管理器获取 name 为 'John' 的对象。如果找不到这个对象,则会抛出 DoesNotExist 异常,并将 my_object 设为 None。
之后将 my_object 传递给模板并在模板中进行处理
{{ my_object.name }}
{% if my_object %}
{{ my_object.description }}
{% else %}
Sorry, this object doesn't exist!
{% endif %}
这样就能在my_object不存在的时候规避错误并处理这种情况了。