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

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


当前回答

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

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

其他回答

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

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

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

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)

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

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

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

user = validated_data['user']

在视图中使用以下代码:

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

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

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