【问题标题】:DRF what's the difference between serializers(many=True) vs ListField(serializer())DRF 序列化器(many=True)与 ListField(序列化器())有什么区别
【发布时间】:2020-06-06 08:00:36
【问题描述】:

我应该什么时候使用以下各项?

* MySerializer(many=True)
* serializers.ListField(child=MySerializer())

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    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"}]}, ]
    

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 2019-07-21
      • 2019-08-07
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多