【发布时间】:2020-02-12 05:22:22
【问题描述】:
我试图实现这个answer 来为我的所有ModelViewSet 类创建一个自定义基础Response 类。我的问题出在retrieve 函数上。如果找不到我正在寻找的实例的Id,我似乎无法用我修改的response_format 更改Response。它仍然给出默认响应。我应该将我的if 条件更改为什么?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 响应。例如http://127.0.0.1:8000/languages/1/:
{
"message": "success",
"error": null,
"data": {
"id": 1,
"name": "English",
"icon": "http://127.0.0.1:8000/media/language_icons/English.png",
"xml": "http://127.0.0.1:8000/media/-",
"abbreviation": "En"
}
}
未找到实例时的 JSON 响应。例如网址:http://127.0.0.1:8000/languages/4/:
{
"detail": "Not found."
}
我希望得到的回应:
{
"message": "Instance not found.",
"error": "HTTP_404_NOT_FOUND",
}
如果没有错误,是否可以不显示"error" 变量?对于这种情况,当列表不为空并找到搜索的实例时。
【问题讨论】:
标签: python django django-rest-framework