Django rest framework - 字典结构有效载荷的序列化器

Django rest framework - serializer for dictionary structured payload

我正在尝试为看起来像这样的有效负载创建序列化程序 -

{
 "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"
 }
]

然后序列化。否则,您将创建不漂亮的自定义 fields/serializers。

我最终解决的方法是添加一个包含请求的真实负载的动态 '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']

这对我有用。