Python 如何使用Django RF修补Django的用户模型?

Python 如何使用Django RF修补Django的用户模型?,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我有一个UserProfile模型,它包含电话,个人资料照片和Django默认用户模型的一些字段,如名字,姓氏,电子邮件,我正在尝试更新其中的一些字段 型号.py class UserProfile(models.Model): user = models.ForeignKey(User, verbose_name="User") phone = models.CharField(max_length=16, verbose_name="Phone") profile_p

我有一个UserProfile模型,它包含
电话
个人资料照片
和Django默认用户模型的一些字段,如
名字
姓氏
电子邮件
,我正在尝试更新其中的一些字段

型号.py

class UserProfile(models.Model):
    user = models.ForeignKey(User, verbose_name="User")
    phone = models.CharField(max_length=16, verbose_name="Phone")
    profile_photo = models.ImageField(null=True, blank=True, upload_to=user_directory_path, verbose_name="Profile Photo")
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'first_name', 'last_name', 'email')

class UserProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer(partial=True)

    class Meta:
        model = UserProfile
        fields = '__all__'

    def create(self, validated_data):
        user_profile = UserProfile.objects.create(**validated_data)
        return user_profile
class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    authentication_classes = (TokenAuthentication,)

    @detail_route(methods=['PATCH'], url_path='update-partial')
    def user_profile_update_partial(self, request, pk=None):
        profile = UserProfile.objects.get(id=pk)
        serializer = self.get_serializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)
序列化程序.py

class UserProfile(models.Model):
    user = models.ForeignKey(User, verbose_name="User")
    phone = models.CharField(max_length=16, verbose_name="Phone")
    profile_photo = models.ImageField(null=True, blank=True, upload_to=user_directory_path, verbose_name="Profile Photo")
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'first_name', 'last_name', 'email')

class UserProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer(partial=True)

    class Meta:
        model = UserProfile
        fields = '__all__'

    def create(self, validated_data):
        user_profile = UserProfile.objects.create(**validated_data)
        return user_profile
class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    authentication_classes = (TokenAuthentication,)

    @detail_route(methods=['PATCH'], url_path='update-partial')
    def user_profile_update_partial(self, request, pk=None):
        profile = UserProfile.objects.get(id=pk)
        serializer = self.get_serializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)
视图.py

class UserProfile(models.Model):
    user = models.ForeignKey(User, verbose_name="User")
    phone = models.CharField(max_length=16, verbose_name="Phone")
    profile_photo = models.ImageField(null=True, blank=True, upload_to=user_directory_path, verbose_name="Profile Photo")
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('url', 'first_name', 'last_name', 'email')

class UserProfileSerializer(serializers.ModelSerializer):
    user = UserSerializer(partial=True)

    class Meta:
        model = UserProfile
        fields = '__all__'

    def create(self, validated_data):
        user_profile = UserProfile.objects.create(**validated_data)
        return user_profile
class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    authentication_classes = (TokenAuthentication,)

    @detail_route(methods=['PATCH'], url_path='update-partial')
    def user_profile_update_partial(self, request, pk=None):
        profile = UserProfile.objects.get(id=pk)
        serializer = self.get_serializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)
如果我用此
@detail\u route
发送
profile\u photo
phone
first\u name
last\u name
数据,我只能更新phone和profile\u photo字段。当
profile\u photo
数据未发送时,也会收到错误的请求错误

如何使用
补丁
方法实现
部分更新

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    authentication_classes = (TokenAuthentication,)

    def partial_update(self, request, *args, **kwargs):
        profile = self.get_object()
        serializer = self.get_serializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            user_serializer = UserSerializer(profile.user, data=request.data, partial=True)
            if user_serializer.is_valid():
                user_serializer.save()
                serializer.save()
                return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
            else:
               return Response(data=user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST)
Q1:如何实现
补丁
方法

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    authentication_classes = (TokenAuthentication,)

    def partial_update(self, request, *args, **kwargs):
        profile = self.get_object()
        serializer = self.get_serializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            user_serializer = UserSerializer(profile.user, data=request.data, partial=True)
            if user_serializer.is_valid():
                user_serializer.save()
                serializer.save()
                return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
            else:
               return Response(data=user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST)
A1:覆盖
部分更新
方法

问题2:如何更新
名字
姓氏

A2:使用另一个名为
UserSerializer
的序列化程序更新它(如果您想要更新密码,您需要使用
make\u password
方法在将原始密码保存到数据库之前创建编码密码)

Q1:如何实现
补丁
方法

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    authentication_classes = (TokenAuthentication,)

    def partial_update(self, request, *args, **kwargs):
        profile = self.get_object()
        serializer = self.get_serializer(profile, data=request.data, partial=True)
        if serializer.is_valid():
            user_serializer = UserSerializer(profile.user, data=request.data, partial=True)
            if user_serializer.is_valid():
                user_serializer.save()
                serializer.save()
                return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
            else:
               return Response(data=user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST)
A1:覆盖
部分更新
方法

问题2:如何更新
名字
姓氏


A2:使用另一个名为
UserSerializer
的序列化程序更新它(如果您想要更新密码,您需要在将原始密码保存到数据库之前使用
make\u password
方法创建编码密码)

感谢您的快速响应。事实上,我确实解决了这个问题。但现在我在更新ImageField模型字段时遇到了问题。错误是:
提交的数据不是文件。检查表单上的编码类型。
您必须将输入数据添加为formdata。感谢您的快速响应。事实上,我确实解决了这个问题。但现在我在更新ImageField模型字段时遇到了问题。错误是:
提交的数据不是文件。检查表单上的编码类型。
您必须将输入数据添加为表单数据。