我想在 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":{}
}
}
您可以重写 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)