问题
When should I use each of the following?
* MySerializer(many=True)
* serializers.ListField(child=MySerializer())
回答1:
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)
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}]
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())
Now see the result:
objects = [{"my_data": [{"a": "a1", "b": "b1"}], "tralala": "blablabla"}, ]
serializer = AnotherSerializer(objects, many=True)
serializer.data
# [{"my_data": [{"a": "a1"}]}, ]
来源:https://stackoverflow.com/questions/62228942/drf-whats-the-difference-between-serializersmany-true-vs-listfieldserializer