我当前的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的序列化程序只接受预定的字典键(“键”和“值”)而不是可变字典键,这是新提出的格式使用的。到目前为止,我发现无法使内置序列化程序使用新格式。
关于我应该做什么的任何线索?
答案 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模型集转换为字典。
希望这有帮助!