AssertionError:`.update()`方法不支持可写的嵌套字段

时间:2017-02-26 14:14:34

标签: python django django-rest-framework django-serializer

我有一个DeviceSerializer和DeviceGroupSerializer。 DeviceSerializer将ios字段作为foreignkey,我使用save_ios,创建和更新函数,以便与设备一起保存在数据库中。但我需要再添加一个device_group字段,device_group和device的关系是一对多(设备可以在一个组上,但一个组可以有多个设备)。

这是我的序列化程序

class DeviceGroupSerializer(serializers.ModelSerializer):
    name = serializers.StringRelatedField()
    class Meta:
        model = DeviceGroup
        fields = ('name',)

class DeviceSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source='token', format='hex', read_only=True)
    ios = DeviceIOSerializer(read_only=False, many=True, required=False)
    device_group = DeviceGroupSerializer(required=False)
    class Meta:
        model = Device
        fields = ('id', 'name', 'description', 'ios', 'device_group')

    def save_ios(self, device, ios):
        for io in ios:
            token = io.pop('token', None)
            if token is None:
                DeviceIO.objects.create(device=device, **io)
            else:
                DeviceIO.objects.filter(token=token, device=device).update(**io)

    def update(self, instance, validated_data):
        ios = validated_data.pop('ios',[])
        instance = super(DeviceSerializer, self).update(instance, validated_data)
        if len(ios):
            self.save_ios(instance, ios)
        return instance

    def create(self, validated_data):
        ios = validated_data.pop('ios',[])
        instance = super(DeviceSerializer, self).create(validated_data)
        if len(ios):
            self.save_ios(instance, ios)

        return instance

当我尝试创建新组时,我收到以下错误

  

AssertionError:.update()方法不支持可写

     

默认情况下为嵌套字段。为

编写明确的.update()方法      

序列化程序device_api.serializers.DeviceSerializer或设置

     

read_only=True嵌套序列化程序字段。

当我添加read_only=True时,没有错误,但创建的组未显示在设备中。

0 个答案:

没有答案