我试过类似的方法,但不管用。

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

    def save(self):
        user = self.context['request.user']
        title = self.validated_data['title']
        article = self.validated_data['article']

我需要一种能够访问请求的方法。用户从我的Serializer类。


当前回答

你不能直接访问self.context.user。首先,你必须在序列化器中传递上下文。以下步骤如下:

Some where inside your api view: class ApiView(views.APIView): def get(self, request): items = Item.object.all() return Response( ItemSerializer( items, many=True, context=request # <- this line (pass the request as context) ).data ) Then inside your serializer: class ItemSerializer(serializers.ModelSerializer): current_user = serializers.SerializerMethodField('get_user') class Meta: model = Item fields = ( 'id', 'name', 'current_user', ) def get_user(self, obj): request = self.context return request.user # <- here is current your user

其他回答

在序列化器中获取当前用户的最好方法是这样的。

AnySerializer(data={
        'example_id': id
    }, context={'request': request})

这必须在views.py中编写 现在在serializer。py部分

user = serializers.CharField(default=serializers.CurrentUserDefault())

这个“用户”必须是你在模型中的字段,就像任何关系一样,比如外键

在GET方法中:

添加context={'user':请求。View类中的user}:

class ContentView(generics.ListAPIView):
    def get(self, request, format=None):
        content_list = <Respective-Model>.objects.all()
        serializer = ContentSerializer(content_list, many=True, 
                                       context={'user': request.user})

在Serializer类方法中获取:

class ContentSerializer(serializers.ModelSerializer):
    rate = serializers.SerializerMethodField()

    def get_rate(self, instance):
        user = self.context.get("user") 
        ...  
    ...

POST方法:

遵循其他答案(例如Max的答案)。

DRF SRZ页面

在我的项目中,我的用户字段是只读的,所以我需要得到 创建方法中的用户id

class CommentSerializer(serializers.ModelSerializer):
    comment_replis = RecursiveField(many=True, read_only=True)
    user = UserSerializer(read_only=True)

    class Meta:
        model = PostComment
        fields = ('_all_')

    def create(self, validated_data):
 


        post = PostComment.objects.create(**validated_data)   
        print(self._dict_['_kwargs']['data']["user"]) # geting #request.data["user"] #  <- mian code
        post.user=User.objects.get(id=self._dict_['_kwargs']['data']["user"])
        return post


在我的项目中,我尝试了这种方法,并成功了

你不能直接访问self.context.user。首先,你必须在序列化器中传递上下文。以下步骤如下:

Some where inside your api view: class ApiView(views.APIView): def get(self, request): items = Item.object.all() return Response( ItemSerializer( items, many=True, context=request # <- this line (pass the request as context) ).data ) Then inside your serializer: class ItemSerializer(serializers.ModelSerializer): current_user = serializers.SerializerMethodField('get_user') class Meta: model = Item fields = ( 'id', 'name', 'current_user', ) def get_user(self, obj): request = self.context return request.user # <- here is current your user

在视图中使用以下代码:

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

然后在序列化器中使用这个访问它:

user = self.context.get("request").user