您的位置:

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不存在的时候规避错误并处理这种情况了。