DRF序列化器(many = True)与ListField(serializer())有什么区别 [英] DRF what's the difference between serializers(many=True) vs ListField(serializer())
问题描述
何时应使用以下各项?
* MySerializer(many=True)
* serializers.ListField(child=MySerializer())
推荐答案
MySerializer(many = True)
-您可以在 MySerializer
对每个对象进行一些序列化时使用。
serializers.ListField(child = MySerializer())
-如果您不仅要序列化对象,而且还要序列化可迭代数据,则可以使用此代码。
MySerializer(many=True)
- you can use when MySerializer
makes some serialization of each of your objects.
serializers.ListField(child=MySerializer())
- this one you can use if you want to serialize not only objects, but result iterable data too.
例如,您要为每个对象附加其在结果列表中的位置:
For example, you want to append for each object its position in result list:
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
的结果数据,则看起来像是:
now, if you will get result data of MySerializer
it will be looks like:
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())
作为另一个序列化器的字段:
Also, you can use serializers.ListField(child=MySerializer())
as a field of another serializer:
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"}]}, ]
这篇关于DRF序列化器(many = True)与ListField(serializer())有什么区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!