首页 > 解决方案 > How to patch a certain user object?

问题描述

so im trying to make a url like some_site/me/, that shows my profile and the patch for some reason doesnt work heres a view:

class MyUserViewSet(viewsets.ModelViewSet):
    pagination_class = None
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer
    def get_queryset(self):
    
        return User.objects.filter(username=self.request.user.username)
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset[0])
        return Response(serializer.data)

    def partial_update(self, request, *args, **kwargs):
        queryset = self.list()
        serializer = UserSerializer(queryset, data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()

a serializer:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = 'first_name', 'last_name', 'username', 'bio', 'email', 'role'
        lookup_field = 'username'

a model if needed

class User(AbstractUser):
 
    USER_ROLE = (
        ('user', 'user'),
        ('moderator', 'moderator'),
        ('admin', 'admin'),
    )
 
    role = models.CharField(max_length=9, choices=USER_ROLE, default='user')
    email = models.EmailField('email address', unique=True)
    bio = models.TextField(max_length=300, blank=True, null=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['role',]

my guess is smths up with the retrieve thing

标签: python-3.xdjangodjango-rest-framework

解决方案


问题在def list(...). 它返回一个响应(一个 HTTP 响应)而不是一个对象。

class MyUserViewSet(viewsets.ModelViewSet):
    pagination_class = None
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer
    def get_queryset(self):    
        return User.objects.filter(username=self.request.user.username)

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(queryset[0])
        return Response(serializer.data)

    def partial_update(self, request, *args, **kwargs):
        user = User.objects.filter(username=self.request.user.username)
        # update the user obj as per data received in request.data
        # don't forget to call user.save() 
        # return Nothing or None

推荐阅读