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)
默认情况下,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)