“用户”类型的 DRF 对象不是 JSON 可序列化的

Ish*_*are 2 django django-models django-serializer django-rest-framework

我试图通过以下方式返回当前登录用户的详细信息:

from .serializers import UserSerializer

class UserDetailsView(RetrieveAPIView):                                                                                                                                                                           
    model = User                                                                                                                                                                                                  
    queryset = User.objects.all()                                                                                                                                                                                 
    permission_classes = [permissions.IsAuthenticated]                                                                                                                                                            
    serializer_class = UserSerializer                                                                                                                                                                             

    def get(self, request, *args, **kwargs):                                                                                                                                                                      
        user = User.objects.get(id=request.user.id)                                                                                                                                                               
        print(user)                                                                                                                                                                                               
        return Response(user)
Run Code Online (Sandbox Code Playgroud)

在 serializers.py 我使用过 ModelSerializer

class UserSerializer(serializers.ModelSerializer):                                                                                                                                                                
      password = serializers.CharField(write_only=True)                                                                                                                                                             

      def create(self, validated_data):                                                                                                                                                                             
          user = UserModel.objects.create(username=validated_data['username'])                                                                                                                                      
          user.set_password(validated_data['password'])                                                                                                                                                             
          user.save()                                                                                                                                                                                               
          return user                                                                                                                                                                                               

      class Meta:                                                                                                                                                                                                   
          model = UserModel                                                                                                                                                                                         
          fields = ('id', 'username', 'password')                                                                                                                                                                   
          write_only_fields = ('password',)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误Object of type 'User' is not JSON serializable。我的用例有什么问题?

Ult*_*ndz 7

你需要返回

return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

在 UserDetailsView 下的 get 函数中。更多细节在这里


nev*_*ner 6

DRF 响应应该是类似 JSON 的对象,要将模型实例转换为它,您可以使用 seralizer 类:

def get(self, request, *args, **kwargs):                                                                                                                                                                      
    user = User.objects.get(id=request.user.id)    
    serializer = self.get_serializer(user)                                                                                                                                                                                                                                                                                                                                                    
    return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

另外,您不需要额外的查询来获取当前用户,您可以request.user直接使用:

serializer = self.get_serializer(request.user)    
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)