【问题标题】:How to update user data using django and rest framework?如何使用 django 和 rest 框架更新用户数据?
【发布时间】:2018-02-14 03:06:18
【问题描述】:

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

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

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

谢谢。

型号

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

    def __str__(self):
        return self.nome_empresa

序列化器

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')

查看

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)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    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')
    

    【讨论】:

    • 你是什么意思place_data是错字吗?
    • 发生错误:TypeError: update() missing 1 required positional argument: 'validated_data'
    • 我能够正确包含 validate_data,但返回成功,数据库中没有保存任何其他内容。
    猜你喜欢
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2018-10-28
    • 2019-01-20
    • 2017-08-19
    相关资源
    最近更新 更多