【问题标题】:How to Patch an User Model of Django with Django RF?如何使用 Django RF 修补 Django 的用户模型?
【发布时间】:2023-03-17 19:06:01
【问题描述】:

我的 UserProfile 模型包含 phoneprofile_photo 和 Django 默认用户模型的一些字段,例如 first_namelast_nameemail,我正在尝试更新其中一些字段。

models.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")

serializers.py

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

views.py

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_route 发送profile_photophonefirst_namelast_name 数据,我只能更新电话和profile_photo 字段。当profile_photo 数据未发送时也会出现 Bad Request 错误。

如何使用PATCH 方法实现partial_update

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:
    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:如何实现PATCH方法?

    A1:覆盖partial_update 方法。

    Q2:如何更新first_namelast_name

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

    【讨论】:

    • 感谢您的快速响应。实际上我确实用dealing with nested fields in django 解决了这个问题。但是现在我在更新 ImageField 模型字段时遇到了麻烦。错误是:the submitted data was not a file. Check the encoding type on the form.
    • 您必须将输入数据添加为表单数据。
    猜你喜欢
    • 2023-03-31
    • 2012-07-18
    • 2011-09-15
    • 2018-02-04
    • 1970-01-01
    • 2018-09-29
    • 2019-12-26
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多