未查找嵌套序列化程序的实例

时间:2015-04-16 16:11:11

标签: django-rest-framework

使用Django Rest Framework 3.1,我的案例如下:

# models.py

class OrganizationUser(models.Model):
    user = models.ForeignKey(USER_MODEL)
    organization = models.ForeignKey(ORGANIZATION_MODEL)

# serializers.py

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = get_user_model()

class OrganizationUserSerializer(serializers.ModelSerializer):

    user = UserSerializer()

    class Meta:
        model = OrganizationUser

我已经简化了上面的一些代码来解决这个问题。

我遇到的问题是,当我尝试通过视图集更新OrganizationUser时,我收到了验证错误:

{"user":{"username":["This field must be unique."]}}

在调试中,我发现UniqueValidator引发了错误,这是因为没有在用户名字段的父级(即UserSerializer)上设置用户实例。

所以我将随后的to_internal_value实现添加到OrganizationUserSerializer,然后它正常工作:

def to_internal_value(self, data):

    if self.instance:

        # set user instance on its serializer
        user = self.instance.user
        self.fields['user'].instance = user

        # make sure correct user is specified in request data
        try:
            user_id = self.initial_data['user']['id']
        except KeyError:
            raise fw_serializers.ValidationError('User must be specified')

        if user_id != user.id:
            raise fw_serializers.ValidationError('Invalid user specified')

    return super(OrganizationUserSerializer, self).to_internal_value(data)

但是我认为REST框架会自动完成吗?那不是这样吗?应用程序负责查找任何嵌套的序列化程序实例吗?

1 个答案:

答案 0 :(得分:2)

您可以通过修改UserSerializer的to_internal_value方法来实现此行为:

weapon[foo]

现在,如果您将一些数据发送到UserSerializer,其中有一个用户名作为数据的一部分,它将假设您正在发送属于现有对象的数据,查找并返回它。