How to set current user to user field in Django Rest Framework?

前端 未结 9 2015
后悔当初
后悔当初 2020-12-02 15:30

I have the following code working perfectly. I can create a Post object from DRF panel by selecting an image and a user. However I want DRF to populate the user

9条回答
  •  旧时难觅i
    2020-12-02 15:40

    You will have to override the default behavior of how generics.ListCreateAPIView creates an object.

    class PhotoListAPIView(generics.ListCreateAPIView):
        queryset = Post.objects.filter(hidden=False)
        authentication_classes = (SessionAuthentication, BasicAuthentication)
        permission_classes = (IsAuthenticated,)
    
        def get_serializer_class(self):
            if self.request.method == 'POST':
                return CreatePostSerializer
            else:
                return ListPostSerializer
    
        def create(self, request, *args, **kwargs):
            # Copy parsed content from HTTP request
            data = request.data.copy()
    
            # Add id of currently logged user
            data['user'] = request.user.id
    
            # Default behavior but pass our modified data instead
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            self.perform_create(serializer)
            headers = self.get_success_headers(serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    

    The .get_serializer_class() is not necessary as you can specify which fields are read-only from your serializer, but based on the projects I have worked on, I usually end up with 'asymmetric' serializers, i.e. different serializers depending on the intended operation.

提交回复
热议问题