Django Rest 框架 ListField 和 DictField
Posted
技术标签:
【中文标题】Django Rest 框架 ListField 和 DictField【英文标题】:Django Rest Framework ListField and 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
以了解它是否有效。
【参考方案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 我昨天做了,这是我的问题***.com/questions/50091847/… 我在那里进行了编辑。请你看一下好吗?以上是关于Django Rest 框架 ListField 和 DictField的主要内容,如果未能解决你的问题,请参考以下文章
Django + AngularJS:没有使用普通 URL 和视图的 Django REST 框架的类 REST 端点?
Django Rest 框架的 ModuleNotFoundError