0

我正在与 djoser 合作,在阅读文档后,我想从 Userviewset 更改代码的某些部分。
我想覆盖def me(self, request, *args, **kwargs)和自定义它。对于 get 请求,我不想返回模型的所有字段,而是只返回UsernameProfile Picture
我试着做from djoser.views import UserViewSet。然后,

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)

但我想知道这会起作用,因为既没有retrieve也没有get_instance提到。有没有更短的正确方法来做到这一点?

4

2 回答 2

0

如果您想返回不同的响应,GET /users/me那么您只需要更改您的序列化程序。

你甚至可以在没有子类化的情况下做到这一点UserViewSetUserViewSet.get_serializer_class里面有

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

所以在 djoser 设置中分配一个不同的序列化程序。

查看文档

于 2020-09-21T15:49:30.307 回答
0

不要触摸视图集,如果您想稍后返回要返回的数据,请重新定义使用 djoser 的序列化程序。这是序列化程序的示例

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

然后在 DJOSER 设置中使用这个序列化程序

DJOSER = {
    "..."
    "SERIALIZERS":{
        'current_user': 'bingo.serializers.CustomUserSerializer',
    }
}
于 2021-09-23T12:12:28.790 回答