嵌套serializ的Access create方法

2024-04-16 15:14:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两个子序列化程序的父序列化程序。子序列化程序被重用,它们具有更新和创建的逻辑。你知道吗

我的请求数据是这样的

{
 'key1': [
          {'keyA': value},
          {'keyA': value}
        ]
 'key2': [
          {'keyB': value},
          {'keyB': value}
         ]
}

这些是我写的序列化程序

class ParentSerializer(serializers.Serializer):
    key1 = Key1Serializer(many=True)
    key2 = Key2Serializer(many=True)

    class Meta:
    ...

子序列化程序

class Key1Serializer(serializers.ModelSerializer):
    keyA = serializers.CharField(required=True)
    class Meta:
       model = Key1
       fields = ('keyA')
    list_serializer_class = MultipleKey1Serializer
class Key1Serializer(serializers.ModelSerializer):
    keyB = serializers.CharField(required=True)
    class Meta:
       model = Key2
       fields = ('keyB')
    list_serializer_class = MultipleKey2Serializer

列出序列化程序

class MultipleKey1Serializer(serializers.ListSerializer):
    def update(self, extra_params):
        for el in self.validated_data:
           ... #update logic
class MultipleKey2Serializer(serializers.ListSerializer):
    def create(self, extra_params):
        for el in self.validated_data:
           ... #create logic

这就是初始化父序列化程序的方式

serializer = ParentSerializer(data=request_data)
serializer.is_valid() # <- works perfectly, validates all the fields

因此嵌套的序列化程序可以完美地验证数据。现在我只想在Key1Serializer中调用update方法,并在Key2Serializer中创建方法。你知道吗

我试着用懒惰的方式来称呼它

serializer.data['key2'].create(params)

但这不是正确的方法。有人能帮我吗?你知道吗


Tags: self程序truefieldsdata序列化valuemeta
1条回答
网友
1楼 · 发布于 2024-04-16 15:14:16

因此,正如您已经发现的,嵌套的序列化程序实例在验证之后不会保存在任何地方,因此您必须手动重新创建它们。可以在父序列化程序的create方法中执行此操作:

def create(self, validated_data):
    k1_data = validated_data.pop('key1')
    k2_data = validated_data.pop('key2')

    instance = super().create(validated_data)

    serializer = Key1Serializer(k1_data, context=self.context, many=True)
    serializer.is_valid(raise_exception=True)
    serializer.save()

    serializer2 = Key2Serializer(k2_data, context=self.context, many=True)
    serializer2.is_valid(raise_exception=True)
    serializer2.save()

    return instance

相关问题 更多 >