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', '')
Вернуться на верх