我有一个如下的ModelSerializer类,我想接受一个项目列表或一个项目(字典)作为数据。文档声明将“many”传递为True将支持我的要求。
class PointSerializer(serializers.ModelSerializer):
class Meta:
model = Point
def __init__(self, *args, **kwargs):
if "data" in kwargs:
if isinstance(kwargs["data"]):
kwargs["many"] = True
super(PointSerializer, self).__init__(*args, **kwargs)
现在,提供如下数据字典:
p = PointSerializer(data={'x':10, 'y': 12})
p.is_valid() # True
但是,这个词典列表失败了:
p = PointSerializer(data=[{'x':10, 'y':12}, {'x':12, 'y':12}])
p.is_valid() # False
p.errors() # {'non_field_errors': ['Invalid data. Expected a dictionary, but got a list.']}
更新
感谢您选择的答案,我已将代码更改为以下内容并且工作正常:
class PointSerializer(serializers.ModelSerializer):
class Meta:
model = Point
>>> ps = PointSerializer(data={'x':10, 'y':12})
>>> ps.is_valid()
... True
>>> ps = PointSerializer(data=[{'x':10, 'y':12}, {'x':12, 'y':12}], many=True)
>>> ps.is_valid()
... True
答案 0 :(得分:1)
many=True
参数仅在实例化序列化程序时有效,因为它会在场景后面返回ListSerializer
。
您的选项是在创建调用期间将many = True设置为序列化程序参数,或者明确使用ListSerializer。