【问题标题】:Patch Method with Extend User Model in Django Rest Framework在 Django Rest Framework 中扩展用户模型的补丁方法
【发布时间】:2018-01-13 09:57:47
【问题描述】:

我很困惑在 Django Rest Framework 中使用扩展用户模型创建 Patch 方法。希望大家帮忙。

我的扩展用户模型:

class Profile(models.Model):
    user = models.OneToOneField(User, unique=True)
    bio = models.CharField

我的序列化器:

class UserEditSerializer(ModelSerializer):
bio = serializers.CharField(source='profile.bio')
class Meta:
    model = User
    fields = [
        'username',
        'email',
        'first_name',
        'last_name',
        'bio'
    ]

我的观点集:

class UserUpdateAPIView(ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = UserEditSerializer

@detail_route(methods=['PATCH'])
def edit(self, request):
    user_obj = User.objects.get(user__id=request.user.id)
    print(user_obj)
    serializer = UserEditSerializer(user_obj, data=request.data, partial=True)
    print(request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(status=status.HTTP_400_BAD_REQUEST)

使用 POSTMAN 发送的数据 (json)

{ "email": "231@sda.com", "profile": {"bio": "无法发送请求" } }

错误:

Profile.Bio cant response true data

照片:

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    UserEditSerializer 的模型是Profile 类。但是您尝试将 User 实例作为对象传递。您需要更改序列化程序类:

    class UserEditSerializer(ModelSerializer):
        bio = serializers.CharField(source='profile.bio')
        class Meta:
            model = User
            fields = [
                'username',
                'email',
                'first_name',
                'last_name',
                'bio',
            ]
    

    或查看:

    @detail_route(methods=['PATCH'])
    def edit(self, request):
        user_obj = Profile.objects.get(user__id=request.user.id)
        serializer = UserEditSerializer(user_obj, data=request.data, partial=True)
    

    UPD

    要使嵌套关系可写,您需要覆盖序列化程序的createupdate 方法,请参阅doc 中的详细信息。 示例:

    class UserEditSerializer(ModelSerializer):
        bio = serializers.CharField(source='profile.bio')
        class Meta:
            model = User
            fields = [
                'username',
                'email',
                'first_name',
                'last_name',
                'bio',
            ]
        def update(self, instance, validated_data):
            profile = validated_data.pop('profile')
            instance = super().update(instance, validated_data)
            instance.profile.bio = profile.get('bio', instance.profile.bio)
            instance.profile.save()            
            return instance
    

    你还需要像{ "email": "231@sda.com", "bio": "Cant send request" }这样发布数据。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2020-04-23
    • 2022-11-01
    相关资源
    最近更新 更多