Django Rest框架ListField和DictField

2024-06-14 07:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力理解ListFieldDictField。我想将它用作序列化程序上的字段。我有一个ListField可能包含许多DictField。我试图编写一个序列化程序,如下所示:

class StopOncomingSerialier(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    buses = serializers.ListField(
        child=serializers.DictField(
            idn=serializers.IntegerField(read_only=True),
            stops_left=serializers.IntegerField(read_only=True)
        ),
    read_only=True
    )

我知道,这没有意义,因为文档中说DictFieldListFieldchild作为参数。因此,上面的代码自然会引发错误:

TypeError: __init__() got an unexpected keyword argument 'stops_left'

期望输出

{
    "idn": 1,
    "buses": [
        {"idn": 11, "stops_left": 4},
        {"idn": 12, "stops_left": 15}
    ]
}

如何做到这一点?buses是一个列表,可以包含任意多的元素。


环境

  • Python3.5.1
  • django 1.9.6公司
  • django rest框架3.3.3

Tags: django程序childtrueonlyread序列化left
1条回答
网友
1楼 · 发布于 2024-06-14 07:25:12

我认为应该使用嵌套的序列化器,而不是这样做。

创建具有字段idnstops_leftBusSerializer。然后将这个序列化程序作为buses字段包含在many=True参数中,以处理多个buses数据。

class BusSerializer(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    stops_left = serializers.IntegerField(read_only=True)


class StopOncomingSerialier(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    buses = BusSerializer(many=True)

相关问题 更多 >