为每个嵌套的序列化程序获取单独的序列化程序响应

Get separate serializer response for each nested serializer

卡在序列化程序中,我需要基于嵌套序列化程序的序列化响应。

Models.py :

class Parent(models.Model):
    name = models.CharField(max_length=50)

class Child(models.Model):
    parent = models.ForeignKey(Parent, related_name='children')
    child_name = models.CharField(max_length=80)

Serialziers.py

class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Child
        fields = '__all__'

class ParentSerializer(serializers.ModelSerializer):
    child = serializers.SerializerMethodField()
    
    def get_child(self, obj):
        childs = Child.objects.filter(parent=obj)
        return ChildSerializer(childs, many=True).data

    class Meta:
        model = Parent
        fields = '__all__'

我在嵌套的地方得到如下所示的输出 childs:

{
    id : 1,
    name : "Parent1",
    child: [
        0: {id : 1, child_name : "child1"}
        1: {id : 2, child_name : "child2"}
    ]
}

但出于某些商业目的,我需要输出如下所示,其中序列化程序应基于 child。即对于每个 child 应该有单独的 Parent 序列化器。它是否具有相同的 id 和其他字段并不重要。 :

{
    0:{
        id : 1,
        name : "Parent1",
        child: [
            0: {id : 1, child_name : "child1"}
        ]
    }
    1:{
        id : 1,
        name : "Parent1",
        child: [
            0: {id : 2, child_name : "child2"}
        ]
    }
}

另外请告诉我是否可以基于 child 序列化程序进行过滤。即 childs 我将传递给 Parent 序列化程序并为每个 childs 获得响应。

尝试如下更改 Parent Serializer

class ParentSerializer(serializers.ModelSerializer):

    children = ChildSerializer(read_only=True)

    def to_representation(self, instance):
        child_query = Child.objects.filter(parent=instance)
        num_childs = child_query.count()
        ret_instance = {}
        for idx in range(num_childs):
            children = ChildSerializer(child_query[idx:idx + 1], many=True).data
            for child in children:
                child.pop('parent', None)
            temp_dict = {
              'id': instance.id,
              'name': instance.name,
              'child': children
            }
            ret_instance[idx] = temp_dict
        return ret_instance 

    class Meta:
        model = Parent
        fields = '__all__'

要更改序列化程序响应的表示,需要使用 to_representation() 方法。

我直接在parent序列化器中传递了childs对象,并根据它进行过滤。这对我有用。

class ChildSerializer(serializers.ModelSerializer):
    class Meta:
        model = Child
        fields = '__all__'

class ParentSerializer(serializers.ModelSerializer):
    name = serializers.ReadOnlyField(source='parent.name')
    child = serializers.SerializerMethodField()
    
    def get_child(self, obj):
        childs = Child.objects.filter(id=obj.id)
        return ChildSerializer(childs, many=True).data

    class Meta:
        model = Parent
        fields = ("childs", "name")

然后直接将parent中的child对象传过去

child = Child.objects.all()
ParentSerializer(child, many=True)