首页 > 解决方案 > 将带有源属性的已验证数据传递回嵌套序列化程序

问题描述

场景:我有一个包含嵌套序列化程序的序列化程序,我想在该嵌套序列化程序上使用create函数,以便将我的业务逻辑保存在一个地方。

问题:因为嵌套序列化程序使用字段的属性,validated_data父序列化程序上的包含模型字段而不是序列化程序字段名称。当我将其传回时,验证失败

例子:

class FooSerializer():
    foo_amount = serializers.IntegerField(source='foo_quantity')

    class Meta:
        class = Foo
        fields = ('foo_amount')

    def create(self, validated_data):
        # Some business logic

class BarSerializer():
    foo = FooSerializer()

    class Meta:
        class = Bar
        fields = ('foo')

    def create(self, validated_data):
        foo_serializer = FooSerializer(validated_data.pop('foo'))
        
        # Always going to fail because validated_data has 'foo_quantity' as a key
        if foo_serializer.is_valid():
            foo = foo_serializer.save()

标签: python-3.xdjangodjango-rest-framework

解决方案


我不确定是否有更好的方法来解决这个问题,但我发现我可以将initial_data其用作验证器的数据源。

所以离开上面的例子,我的解决方案是:

class BarSerializer():
    foo = FooSerializer()

    class Meta:
        class = Bar
        fields = ('foo')

    def create(self, validated_data):
        foo_serializer = FooSerializer(initial_data.get('foo'))
        
        if foo_serializer.is_valid():
            foo = foo_serializer.save()

推荐阅读