首页 > 解决方案 > 在 django rest 框架中使用嵌套用户更新配置文件

问题描述

我需要使用嵌套序列化程序在一个请求中使用用户更新 Administrator 对象。

我的意见.py

class AdministratorDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Administrator.objects.all()
    serializer_class = AdministratorSerializer
    permission_classes = (
        permissions.IsAuthenticated,
        custom_permissions.IsAdministrator |
        custom_permissions.IsHR |
        permissions.IsAdminUser,
    )

    def put(self, request, *args, **kwargs):
        serializer = AdministratorSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)

serializers.py

class AdministratorSerializer(serializers.ModelSerializer):
    user = UserSerializer(required=True)

    class Meta:
        model = Administrator
        fields = '__all__'

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        password = User.objects.make_random_password()
        user = User.objects.create_user(
            password=password,
            is_administrator=True,
            **user_data
        )
        admin_obj = Administrator.objects.create(user=user, **validated_data)
        send_password.delay(user.email, password)
        return admin_obj

    def update(self, instance, validated_data):
        user_data = validated_data.pop('user')
        print(user_data)
        user = instance.user
        for k, v in user_data.items():
            setattr(user, k, v)
        user.save()
        for k, v in validated_data.items():
            setattr(instance, k, v)
        instance.save()
        return instance

但我得到了400 Bad Request

{
    "user": {
        "email": [
            "user with this email address already exists."
        ]
    }
}

我哪里做错了?为什么要根据put请求创建一个新用户?

标签: djangodjango-rest-framework

解决方案


推荐阅读