Django Rest 框架 ListField 和 DictField

Posted

技术标签:

【中文标题】Django Rest 框架 ListField 和 DictField【英文标题】:Django Rest Framework ListField and DictField 【发布时间】:2016-10-04 09:54:23 【问题描述】:

我很难理解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__() 得到了一个意外的关键字参数“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

【问题讨论】:

不应该child 是一个序列化程序类而不是一个字段实例? [编辑:不,不应该,我的错] Documentation example 将Field 替换为Serializer,这就是我这样做的原因,但我将尝试使用Serializer 以了解它是否有效。 【参考方案1】:

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

创建一个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)

【讨论】:

能否举例说明如何使用StopOncomingSerialier 发布数据?我已经尝试过您的解决方案,如果我从 .validated_data 获取数据,我会得到空列表,但如果我从 request.data 获取数据,我可以获得原始 json 对于示例数据,请查看与此问题相关的SO link。另外,你有没有调用序列化器上的.is_valid()方法来访问validated_data @RahulGupta 如果你不介意我问,那么模型应该是什么样子?我目前正在使用 MongoDB,并且想将一个 json 文档(不是纯文本)写入我的数据库。有可能吗? @Albert 对于mongodb,需要使用DRF-Mongoengine。此外,如果您使用相应的模型发布另一个问题会很有帮助。 @RahulGupta 我昨天做了,这是我的问题***.com/questions/50091847/… 我在那里进行了编辑。请你看一下好吗?

以上是关于Django Rest 框架 ListField 和 DictField的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 中没有“ListField”?

Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?

Django Rest 框架的 ModuleNotFoundError

带有 Django 2.0 的 Django REST 框架 URL

Django REST框架 -1

django.test.client 上的 Django rest 框架导入错误