Django-Rest: как получить доступ к данным, если JSON или URL закодированы внутри представления?
Мне нужно получить доступ к некоторой вложенной информации внутри request.data
внутри определения post
. Передаваемые данные имеют следующую форму:
{
...
"licence": {
"tenant_name": "tenant1",
...
}
}
Поскольку я использую Django Rest с установленными по умолчанию парсерами (JSONParser и FormParser), я могу получать содержимое JSON или HTML формы внутри запроса. Я хотел бы сохранить оба варианта и не менять стандартный parser_classes
представления. request.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', '')