如何序列化/反序列化Django模型

时间:2014-07-02 00:11:59

标签: python django serialization django-rest-framework

我当前的Django REST Framework应用程序有一个带有2个字段的参数模型:“key”和“value”。目前,我的REST API要求客户端使用始终具有相同键的字典列表:“key”和“value:

[
    {
        "key": "my_param_name_1",
        "value": "my_param_value_1"
    },
    {
        "key": "my_param_name_2",
        "value": "my_param_value_2"
    }
]

我知道这种请求格式可以改进:单个字典“key”字段作为键,“value”字段作为值将使客户端请求更简单,更简洁。这是我想要的一个例子:

{
    "my_param_name_1": "my_param_value_1",
    "my_param_name_2": "my_param_value_2"
}

我目前有一个继承自serializers.Serializer的ParameterSerializer类。这是代码:

class ParameterSerializer(serializers.Serializer):
    key = serializers.CharField()    # This forces me to have "key" in every parameter dictionary...
    value = serializers.CharField()  # Same comment for "value".

    class Meta:
        models = Parameter

看起来rest_framework的序列化程序只接受预定的字典键(“键”和“值”)而不是可变字典键,这是新提出的格式使用的。到目前为止,我发现无法使内置序列化程序使用新格式。

关于我应该做什么的任何线索?

1 个答案:

答案 0 :(得分:0)

我最终删除了这个序列化程序,因为我真正需要做的是修改使用此类用作的类序列化程序:

class ConfigurationSerializer(serializers.ModelSerializer):
    parameters = ParameterSerializer(many=True, source='parameter_set')

在进一步说明之前,配置模型包含一组参数模型。

因此,在ConfigurationSerializer中,我用一个继承自serializers.WritableField的字段类变量替换了ParameterSerializer:

class ConfigurationSerializer(serializers.ModelSerializer):
    parameters = ParametersField(source="parameter_set")

    class Meta:
        model = Configuration
        fields = ('id', 'version', 'resource', 'option', 'name', 'parameters')

以下是ParametersField的外观:

class ParametersField(serializers.WritableField):
    def from_native(self, parameters_dict):
        """
        Transform a dictionary of parameters to Django model objects.

        :param parameters_dict: A dictionary of parameters keyed by name.
        :type  parameters_dict: dict

        :returns: A list of Parameter model instances.
        :rtype: list
        """

        print(str([Parameter(key=name, value=value)
                  for name, value in parameters_dict.iteritems()]))
        return [Parameter(key=name, value=value)
                for name, value in parameters_dict.iteritems()]

    def to_native(self, parameter_set):
        """
        Transform the parameters to a dictionary.

        :param parameters: A list of Parameter model instances.
        :type  parameters: list

        :returns: A dictionary of parameters keyed by name.
        :rtype: dict
        """

        parameters_dict = {}
        for parameter in parameter_set.all():
            parameters_dict[parameter.key] = parameter.value
        return parameters_dict

WritableField类允许将任何模型序列化为任意Python数据结构。因为我将JSON返回给客户端,所以我选择将Configuration模型的Parameters模型集转换为字典。

希望这有帮助!