Django Rest:如果JSON或URL在视图中编码,如何访问数据



我需要访问post定义内request.data内的一些嵌套信息。发送的数据采用以下形式:

{
...
"licence": {
"tenant_name": "tenant1",
...
}
}

由于我使用安装了默认解析器(JSONParser和FormParser(的Django Rest,我可以在请求中接收JSON或HTML表单内容。我希望两者都保留,并且不更改视图的默认parser_classesrequest.data根据内容有不同的类型和表示:

  • HTML编码:<QueryDict: {..., 'licence.tenant_name': ['tenant1']}>
  • JSON:{..., 'licence': {'tenant_name': 'tenant1'}}

为了处理此问题,我当前检查type。作为一般用例,有更好的方法吗?

class SubscribeView(views.APIView):
serializer_class = SubscriptionSerializer
permission_classes = (AllowAny, )
def post(self, request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True)
tenant_name = request.data['licence']['tenant_name'] if type(request.data) is dict else request.data['licence.tenant_name']
# perform actions on tenant_name
serializer.save()
status_code = status.HTTP_201_CREATED
response = {
'success': True,
'status_code': status_code,
'message': 'New subscription successfully created',
'subscription': serializer.data
}
return Response(response, status=status_code)

我没有意识到我可以只使用序列化程序本身!它内置了处理多个数据编码的功能。

所以我可以转换一下:

tenant_name = request.data['licence']['tenant_name'] if type(request.data) is dict else request.data['licence.tenant_name']

对此:

tenant_name = serializer.validated_data.get('licence', {}).get('tenant_name', '')

最新更新