代码之家  ›  专栏  ›  技术社区  ›  eugene

DRF序列化器(many=True)和ListField(serializer())之间有什么区别

  •  0
  • eugene  · 技术社区  · 6 年前

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

    * MySerializer(many=True)
    * serializers.ListField(child=MySerializer())
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   ncopiy    6 年前

    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)
    

    现在,如果您将获得以下结果数据 MySerialier 它看起来像:

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

    此外,您还可以使用 序列化器。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"}]}, ]
    
    推荐文章