使用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框架会自动完成吗?那不是这样吗?应用程序负责查找任何嵌套的序列化程序实例吗?
答案 0 :(得分:2)
您可以通过修改UserSerializer的to_internal_value方法来实现此行为:
weapon[foo]
现在,如果您将一些数据发送到UserSerializer,其中有一个用户名作为数据的一部分,它将假设您正在发送属于现有对象的数据,查找并返回它。