Python 如果没有找到Django REST框架的详细信息,如何修改ModelViewSet类中的错误响应?

Python 如果没有找到Django REST框架的详细信息,如何修改ModelViewSet类中的错误响应?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我试图实现这一点,为我的所有ModelViewSet类创建一个自定义的基本Response类。我的问题在于检索功能。如果未找到我要查找的实例的Id,我似乎无法使用修改后的Response\u格式更改响应。它仍然给出默认响应。如果我的条件变为 views.py: class ResponseInfo(object): def __init__(self, **args): self.response = { "message": args.get('

我试图实现这一点,为我的所有
ModelViewSet
类创建一个自定义的基本
Response
类。我的问题在于
检索功能。如果未找到我要查找的实例的
Id
,我似乎无法使用修改后的
Response\u格式更改
响应。它仍然给出默认响应。如果我的
条件变为
views.py

class ResponseInfo(object):
    def __init__(self, **args):
        self.response = {
            "message": args.get('message', 'success'),
            "error": args.get('error', ),
            "data": args.get('data', []),
        }


class LanguageView(viewsets.ModelViewSet):
    def __init__(self, **kwargs):
        self.response_format = ResponseInfo().response
        super(LanguageView, self).__init__(**kwargs)

    permission_classes = [permissions.DjangoModelPermissions]
    queryset = Language.objects.all()
    serializer_class = LanguageSerializer

    def list(self, request, *args, **kwargs):
        # call the original 'list' to get the original response.
        response_data = super(LanguageView, self).list(request, *args, **kwargs)
        # customize the response data.
        self.response_format['data'] = response_data.data
        if not response_data.data:
            self.response_format['message'] = 'List is empty.'
            self.response_format['error'] = response_data.status_code
        return Response(self.response_format)

    def retrieve(self, request, *args, **kwargs):
        response_data = super(LanguageView, self).retrieve(request, *args, **kwargs)
        self.response_format['data'] = response_data.data
        if not response_data.data:
            self.response_format['message'] = 'Instance not found.'
            self.response_format['error'] = response_data.status_code
        return Response(self.response_format)
找到实例时的JSON响应。例如:

未找到实例时的JSON响应。例如URL::

我希望得到的回应是:

{  
    "message": "Instance not found.",  
    "error": "HTTP_404_NOT_FOUND",  
}
如果没有错误,是否可以不显示
“error”
变量?对于这种情况,当列表不为空且找到搜索的实例时。

您可以实现:

要为您的项目应用此处理程序,请将其添加到
REST\u FRAMEWORK
设置:

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}

像往常一样谢谢你,别客气!你的解决方案解决了我的两个问题。我想我可以在
custom\u exception\u handler
中为另一个HTTP错误状态代码创建更多的
elif
条件。
{  
    "message": "Instance not found.",  
    "error": "HTTP_404_NOT_FOUND",  
}
from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = exception_handler(exc, context)

    # Now add the HTTP status code to the response.
    if response is not None and response.status_code == 404:
        response.data = {  
            "message": "Instance not found.",  
            "error": "HTTP_404_NOT_FOUND",  
        }

    return response
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}