python - Django Rest Framework ListField 和 DictField

标签 python django python-3.x django-rest-framework

我很难理解 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 是一个列表,可以包含任意数量的元素。


环境

  • python 3.5.1
  • django 1.9.6
  • django-rest-framework 3.3.3

最佳答案

我认为与其这样做,不如使用嵌套序列化器

创建一个 BusSerializer 具有字段 idnstops_left。然后将此序列化器包含在您的 StopOncomingSerializer 中作为 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)

关于python - Django Rest Framework ListField 和 DictField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629501/

相关文章:

python - 饥饿的 Python worker 的内存泄漏

python scipy : unsupported operand type(s) for ** or pow(): 'list' and 'list'

python - 判断对象是否为 typing.Literal 类型

python - 我想将 .html 中的两个 id 发布到 View 中

python - 使用 django-allauth 启用 oauth 登录,但使用自定义提供程序

python - Arduino 和 python3 串行通信问题

python - 如何以编程方式更改用户代理字符串?

django模型形式,根据ForeignKey模型中的值限制选择

python - 如何自动打开给定文件夹中的所有文本文件?

python - Python 函数参数打包和解包