DRF序列化器(many = True)与ListField(serializer())有什么区别 [英] DRF what's the difference between serializers(many=True) vs ListField(serializer())

查看:771
本文介绍了DRF序列化器(many = True)与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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆