如何使用django和rest框架更新用户数据?

mar*_*lta 2 python django django-rest-framework

尝试更新用户时,出现以下消息:“具有此用户名的用户已存在”

我有一个标准的 Django 用户模型,还有另一个扩展的配置文件模板。

如何更新这些数据,包括用户个人资料。

谢谢。

模型

class Profile(User):
    nome_empresa = models.CharField(max_length=200)
    cnpj = models.CharField(max_length=15)

    def __str__(self):
        return self.nome_empresa
Run Code Online (Sandbox Code Playgroud)

串行器

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = ('nome_empresa', 'cnpj')


class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()
    class Meta:
        model = User
        fields = ('username', 'email', 'first_name', 'last_name', 'profile')
Run Code Online (Sandbox Code Playgroud)

看法

class usuario(APIView):


    def patch(self, request, format=None):

        user = UserSerializer(data=request.data)

        if user.is_valid():
            user.update(instance=request.user)
            return Response(HTTP_200_OK)

        return Response(user.errors)
Run Code Online (Sandbox Code Playgroud)

arj*_*n27 6

默认情况下,django-rest-framework 不更新嵌套序列化器。要更新配置文件对象,您需要重写序列化程序的更新方法。

class UserSerializer(serializers.ModelSerializer):
    profile = ProfileSerializer()

    def update(self, instance, validated_data):
        """Override update method because we need to update
        nested serializer for profile
        """
        if validated_data.get('profile'):
            profile_data = validated_data.get('profile')
            profile_serializer = ProfileSerializer(data=profile_data)

            if profile_serializer.is_valid():
                profile = profile_serializer.update(instance=instance.profile)
                validated_data['profile'] = profile

        return super(UserSerializer, self).update(instance, validated_data)

    class Meta:
        model = User
        fields = ('username', 'email', 'first_name', 'last_name', 'profile')
Run Code Online (Sandbox Code Playgroud)