【发布时间】:2020-06-06 08:00:36
【问题描述】:
我应该什么时候使用以下各项?
* MySerializer(many=True)
* serializers.ListField(child=MySerializer())
【问题讨论】:
标签: django django-rest-framework
我应该什么时候使用以下各项?
* MySerializer(many=True)
* serializers.ListField(child=MySerializer())
【问题讨论】:
标签: django django-rest-framework
MySerializer(many=True) - 你可以在MySerializer 对你的每个对象进行一些序列化时使用。serializers.ListField(child=MySerializer()) - 如果你不仅想序列化对象,而且还想序列化结果可迭代数据,你可以使用这个。
例如,您想为每个对象附加其在结果列表中的位置:
class ListSerializerWithIds(serializers.ListSerializer):
@property
def data(self):
data = super().data
result = []
for i, d in enumerate(data):
d["list_id"] = i
result.append(d)
return result
class MySerializer(serializers.Serializer):
a = serializer.CharField()
@classmethod
def many_init(cls, *args, **kwargs):
kwargs["child"] = cls()
return ListSerializerWithIds(*args, **kwargs)
现在,如果您将获得MySerializer 的结果数据,它将如下所示:
objects = [{"a": "a1", "b": "b1"}, {"a": "a2", "c": "c2"}]
serializer = MySerializer(objects, many=True)
serializer.data
# [{"a": "a1", "list_id": 0}, {"a": "a2", "list_id": 1}]
另外,您可以将serializers.ListField(child=MySerializer()) 用作另一个序列化程序的字段:
class MySerializer(serializers.Serializer):
a = serializers.CharField()
class AnotherSerializer(serializers.Serializer):
my_data = serializers.ListField(child=MySerializer())
现在看看结果:
objects = [{"my_data": [{"a": "a1", "b": "b1"}], "tralala": "blablabla"}, ]
serializer = AnotherSerializer(objects, many=True)
serializer.data
# [{"my_data": [{"a": "a1"}]}, ]
【讨论】: