简化 Django 中的序列化程序类

问题描述 投票:0回答:1

我想在 Django 休息框架中为共享相同属性的一类视图编写序列化程序。为了避免在所有序列化器中写入重复项,我想出了以下结构:

from rest_framework import serializers
from modelserializers import LogModelSerializer

class GenericValueSerializer(serializers.Serializer):

    message = serializers.CharField(required = True, allow_blank=False, allow_null=False)


class GenericResponseSerializer(serializers.Serializer):

    statusCode    = serializers.IntegerField(required=True, allow_null=False)
    statusMessage = serializers.CharField(required = True, allow_blank=False, allow_null=False)


class LoginAppResp(GenericResponseSerializer):


    class LoginAppValue(GenericValueSerializer):
        username = serializers.CharField(required = True, allow_blank=False, allow_null=False)
        token    = serializers.CharField(required = True, allow_blank=False, allow_null=False)

    value = LoginAppValue()


class LogsDeviceResp(GenericResponseSerializer):

    class LogsDeviceValue(GenericValueSerializer):
        logs = LogModelSerializer()

    value = LogsDeviceValue(many=True)

但我在想一定有一种更有效的方法来实现我在这里所做的事情。感谢您的帮助。

编辑:

想要的结构如下:

{
    "statusCode":10,
    "statusMessage":"",
    "value":
    {
        "message":"",
        "api specific field 1":{},
        "api specific field N":{}
    }
}
django-rest-framework django-serializer
1个回答
0
投票

您可以重写 to_representation 来定义每个实体的表示方式。这是一个更清晰的例子:

from rest_framework import serializers
from modelserializers import LogModelSerializer


class GenericResponseSerializer(serializers.Serializer):
    message = serializers.CharField(required=True, allow_blank=False, allow_null=False)
    statusCode = serializers.IntegerField(required=True, allow_null=False)
    statusMessage = serializers.CharField(required=True, allow_blank=False, allow_null=False)

    def to_representation(self, instance):
        inner_value_response = super().to_representation(instance)
        status_code = inner_value_response.pop("statusCode")
        status_message = inner_value_response.pop("status_message")
        return {
            "status_message": status_message,
            "status_code": status_code,
            "value": inner_value_response
        }


class LoginAppResp(GenericResponseSerializer):
    username = serializers.CharField(required=True, allow_blank=False, allow_null=False)
    token = serializers.CharField(required=True, allow_blank=False, allow_null=False)


class LogsDeviceResp(GenericResponseSerializer):
    logs = LogModelSerializer(many=True)

© www.soinside.com 2019 - 2024. All rights reserved.