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

Django rest framework 未查找嵌套序列化程序的实例,django-rest-framework,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.ModelSerial

使用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引发的,这是因为用户实例未设置在username字段的父级(即UserSerializer)上

因此,我将以下to_internal_值实现添加到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框架会自动完成这项工作?不是这样吗?应用程序是否负责查找任何嵌套的序列化程序实例?

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

def to_internal_value(self, data):
    if data and data.get('username'):
        return self.Meta.model.objects.get(username=data['username'])
    return super().to_internal_value(data)

因此,如果您向UserSerializer发送一些数据,其中包含一个用户名作为数据的一部分,那么它将假定您正在发送属于现有对象的数据,查找并返回该数据。

您是否专门研究过它,其中解释了如何“序列化中的相关用户字段”?Hi@Charlie:这个问题涉及Django序列化程序,而不是Django REST框架序列化程序(问题标题有误导性,因为自我回答提供了使用Django而不是DRF的“不同方法”)。我刚刚编辑了这个问题,以:(1)提供解决方案,同时仍然提出DRF是否应该自动处理它的问题,和(2)尖锐化问题,将重点放在实例查找上,而不是由于缺少实例而导致的验证错误。您是否尝试使用kwarg?是的,我尝试了queryset kwarg,但它似乎不受支持。我认为queryset只用于ListSerializer和相关字段。