如何用Django REST Framework编写列表型输入数据的Serializer?
你的Serializer实现有多处错误,正确写法及列表数据处理方法如下
先说说你代码里的问题:
- Python的布尔值是大写
True,不是小写true serializers.Integer()不能这么传参,应该写成serializers.IntegerField(required=False)max_lenght拼写错误,正确是max_length- 处理嵌套列表不能用
[serializer.JSONField()],DRF需要用嵌套Serializer来处理这种结构化的列表数据 - 所有字段必须放在继承自
serializers.Serializer(或ModelSerializer)的类里,你现在只是零散定义变量,不符合DRF的要求
正确的Serializer实现
先写处理单个产品的子Serializer,再写包含产品列表的父Serializer:
from rest_framework import serializers # 处理单个产品结构的子Serializer class ProductSerializer(serializers.Serializer): product_id = serializers.IntegerField(required=False) descriptions = serializers.CharField(max_length=300) # 处理顶层数据的父Serializer class TopLevelSerializer(serializers.Serializer): id = serializers.CharField(write_only=True, required=True) products = ProductSerializer(many=True) # many=True标记这是一个列表字段
列表型数据的Serializer写法
处理列表数据的核心是嵌套Serializer + many=True参数:
- 先为列表里的单个元素定义对应的子Serializer
- 在父Serializer的列表字段中,用子Serializer作为字段类型,加上
many=True,告诉DRF这个字段是列表,需要逐个用子Serializer处理元素 - 如果是序列化模型查询集这类列表数据,实例化Serializer时也要传
many=True,比如ProductSerializer(Product.objects.all(), many=True)
内容的提问来源于stack exchange,提问作者Brian Huynh
相关产品推荐
相关产品推荐

