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

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

其他回答

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

在views.py

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

这是传递请求的示例

在serializers.py

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

来源于Rest框架

你需要在你的序列化器中做一个小编辑:

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']

下面是一个使用Model混合视图集的示例。在create方法中,您可以找到调用序列化器的正确方法。Get_serializer方法正确地填充上下文字典。如果需要使用视图集上定义的不同的序列化器,请参阅update方法,了解如何使用上下文字典初始化序列化器,该方法还将请求对象传递给序列化器。

class SignupViewSet(mixins.UpdateModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):

    http_method_names = ["put", "post"]
    serializer_class = PostSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.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)

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        kwargs['context'] = self.get_serializer_context()
        serializer = PostSerializer(instance, data=request.data, partial=partial, **kwargs)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)    
        return Response(serializer.data)

您无法访问该请求。直接用户。您需要访问请求对象,然后获取用户属性。

是这样的:

user =  self.context['request'].user

或者为了安全起见,

user = None
request = self.context.get("request")
if request and hasattr(request, "user"):
    user = request.user

更多的上下文可以在这里阅读

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

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

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

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

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

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

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']