Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django DRF what';s序列化程序(many=True)与列表字段(serializer())之间的差异_Django_Django Rest Framework - Fatal编程技术网

Django DRF what';s序列化程序(many=True)与列表字段(serializer())之间的差异

Django DRF what';s序列化程序(many=True)与列表字段(serializer())之间的差异,django,django-rest-framework,Django,Django Rest Framework,我应该在什么时候使用以下各项 * MySerializer(many=True) * serializers.ListField(child=MySerializer()) MySerializer(many=True)-当MySerializer对每个对象进行一些序列化时,可以使用它。 serializers.ListField(child=MySerializer())-如果您不仅要序列化对象,而且要序列化结果可重用数据,可以使用此字段 例如,要为每个对象附加其在结果列表中的位置: cla

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

* MySerializer(many=True)
* serializers.ListField(child=MySerializer())
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"}]}, ]