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

我很难理解ListField 和DictField。我想将它用作序列化程序上的字段。我有一个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
    )

我知道,这没有意义,因为文档说 DictField 和 ListField 将 child 作为参数。所以,上面的代码自然会报错:

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 以了解它是否有效。

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


【解决方案1】:

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

创建一个BusSerializer,其中包含idn 和stops_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 我昨天做了,这是我的问题stackoverflow.com/questions/50091847/… 我在那里进行了编辑。请你看一下好吗?
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2015-08-07
  • 2014-04-21
  • 2015-04-26
  • 2015-07-16
相关资源
最近更新 更多