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

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. contentt ['request']访问。用户,但没有在序列化器中工作。

如果你使用DRF显然登录通过令牌是唯一的来源或其他可能是有争议的。

朝着解决方案前进。

传递请求。创建serializer.create时的用户实例

views.py

if serializer.is_valid():
            watch = serializer.create(serializer.data, request.user)

serializer.py

 def create(self, validated_data, usr):
    return Watch.objects.create(user=usr, movie=movie_obj, action=validated_data['action'])

其他回答

解决方案可以很简单,但我尝试使用self. contentt ['request']访问。用户,但没有在序列化器中工作。

如果你使用DRF显然登录通过令牌是唯一的来源或其他可能是有争议的。

朝着解决方案前进。

传递请求。创建serializer.create时的用户实例

views.py

if serializer.is_valid():
            watch = serializer.create(serializer.data, request.user)

serializer.py

 def create(self, validated_data, usr):
    return Watch.objects.create(user=usr, movie=movie_obj, action=validated_data['action'])

如果你正在使用通用视图,并且你想在保存实例时注入当前用户,那么你可以覆盖perform_create或perform_update:

def perform_create(self, serializer):
    serializer.save(user=self.request.user)

User将作为一个属性添加到kwargs中,您可以通过serializer中的validated_data访问它

user = validated_data['user']

在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


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

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

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

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

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

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