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

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类。


当前回答

在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的答案)。

其他回答

你不能直接访问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的答案)。

实际上,你不需要考虑上下文。有一个更好的方法:

from rest_framework.fields import CurrentUserDefault

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post

   def save(self):
        user = CurrentUserDefault()  # <= magic!
        title = self.validated_data['title']
        article = self.validated_data['article']

CurrentUserDefault 可用于表示当前用户的默认类。为了使用这个,'request'必须在实例化序列化器时作为上下文字典的一部分提供。

在views.py

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

这是传递请求的示例

在serializers.py

owner = serializers.HiddenField(
    default=serializers.CurrentUserDefault()
)

来源于Rest框架