0

I am working with djoser and upon reading the documentation, I want to alter some parts of the code from Userviewset.
I want to overwrite def me(self, request, *args, **kwargs) and customize it. For the get request, instead of returning all the fields of the model, I want to return only Username and Profile Picture.
I tried doing from djoser.views import UserViewSet. Then,

class UserViewSet(viewsets.ModelViewSet):

    # from djoser docs which I want to update
    @action(["get", "put", "patch", "delete"], detail=False)
    def me(self, request, *args, **kwargs):
        self.get_object = self.get_instance
        if request.method == "GET":
            return self.retrieve(request, *args, **kwargs)
        elif request.method == "PUT":
            return self.update(request, *args, **kwargs)
        elif request.method == "PATCH":
            return self.partial_update(request, *args, **kwargs)
        elif request.method == "DELETE":
            return self.destroy(request, *args, **kwargs)

But I wonder this would work since neither retrieve nor get_instance are mentioned. Is there a shorter correct way to do this?

otaku_weeb
  • 107
  • 10

2 Answers2

0

If you want to return a different response for GET /users/me then you only need to change your serializer.

You can do that without even subclassing UserViewSet. In UserViewSet.get_serializer_class there's

      elif self.action == "me":
            return settings.SERIALIZERS.current_user

so assign a different serializer in djoser settings.

See docs

Tom Wojcik
  • 5,471
  • 4
  • 32
  • 44
0

Don't touch viewset, if you want to later data you want to return, redefine please serializer that uses djoser. This is example of serializer

from djoser.serializers import UserSerializer
class CustomUserSerializer(UserSerializer):
    avatar = serializers.SerializerMethodField()
    
    def get_avatar(self, obj):
        return obj.profile.avatar.url if obj.profile.avatar else ""

    class Meta:
        model = User
        fields = ("username", "first_name", "avatar")

Then use this serializer in DJOSER settings

DJOSER = {
    "..."
    "SERIALIZERS":{
        'current_user': 'bingo.serializers.CustomUserSerializer',
    }
}
Даниял
  • 151
  • 1
  • 6