Get current user in Model Serializer

前端 未结 4 666
醉话见心
醉话见心 2021-01-31 14:53

Is it possible to get the current user in a model serializer? I\'d like to do so without having to branch away from generics, as it\'s an otherwise simple task that must be done

4条回答
  •  梦谈多话
    2021-01-31 15:12

    I found the answer looking through the DRF source code.

    class ActivitySerializer(serializers.ModelSerializer):
        
        # Create a custom method field
        current_user = serializers.SerializerMethodField('_user')
    
        # Use this method for the custom field
        def _user(self, obj):
            request = self.context.get('request', None)
            if request:
                return request.user
    
        class Meta:
            model = Activity
            # Add our custom method to the fields of the serializer
            fields = ('id','current_user')
    

    The key is the fact that methods defined inside a ModelSerializer have access to their own context, which always includes the request (which contains a user when one is authenticated). Since my permissions are for only authenticated users, there should always be something here.

    This can also be done in other built-in djangorestframework serializers.

    As Braden Holt pointed out, if your user is still empty (ie _user is returning None), it may be because the serializer was not initialized with the request as part of the context. To fix this, simply add the request context when initializing the serializer:

    serializer = ActivitySerializer(
        data=request.data,
        context={
            'request': request
        }
    )
    

提交回复
热议问题