Django rest framework - сериализатор для структурированной полезной нагрузки словаря

Я пытаюсь создать Serializer для полезной нагрузки, которая выглядит примерно так -

{
 "2fd08845-9b21-4972-87ed-2e7fd03448c5": {
     "operation": "Create",
     "operationId": "356f6501-a117-4c8d-98ce-dcb4344d481b",
     "user": "superuser",
     "immediate": "true"
 },
 "fe6d0c85-0021-431e-9955-e8e1b1ebc414": {
     "operation": "Create",
     "operationId": "adcedb2f-c751-441f-8108-2c29667ea9cf",
     "user": "employee",
     "immediate": "false"
 }

}

Я думал использовать DictField, но моя проблема в том, что нет имени поля. Это только словарь ключей и значений.

Я пробовал что-то вроде:

class UserOperationSerializer(serializers.Serializer):
    operation = serializers.ChoiceField(choices=["Create", "Delete"])
    operationId = serializers.UUIDField()
    user = serializers.CharField()
    immediate = serializers.BooleanField()

class UserOperationsSerializer(serializers.Serializer):
    test = serializers.DictField(child=RelationshipAuthorizeObjectSerializer())

Но опять же, нет поля 'test'.

Я думаю, что самый простой путь вперед - это сгладить полезную нагрузку до следующего формата:

[
 {
     "request_id": "2fd08845-9b21-4972-87ed-2e7fd03448c5",
     "operation": "Create",
     "operationId": "356f6501-a117-4c8d-98ce-dcb4344d481b",
     "user": "superuser",
     "immediate": "true"
 },
 {
     "request_id": "fe6d0c85-0021-431e-9955-e8e1b1ebc414",
     "operation": "Create",
     "operationId": "adcedb2f-c751-441f-8108-2c29667ea9cf",
     "user": "employee",
     "immediate": "false"
 }
]

И затем сериализуйте его. В противном случае вы будете создавать пользовательские поля/сериализаторы, что не очень красиво.

В итоге я решил эту проблему, добавив динамическое поле 'body', которое содержит реальную полезную нагрузку запроса.

class UserOperationSerializer(serializers.Serializer):
    operation = serializers.ChoiceField(choices=["Create", "Delete"])
    operationId = serializers.UUIDField()
    user = serializers.CharField()
    immediate = serializers.BooleanField() 

class UserOperationsSerializer(serializers.Serializer):
    body = serializers.DictField(child=UserOperationSerializer())

    def __init__(self, *args, **kwargs):
        kwargs['data'] = {'body': kwargs['data']}
        super().__init__(*args, **kwargs)

Затем, в представлении, я буду использовать эти данные как serializer.validated_data['body']

Это сделало работу за меня.

Вернуться на верх