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

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


当前回答

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

在views.py

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

这是传递请求的示例

在serializers.py

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

来源于Rest框架

其他回答

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

是这样的:

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

或者为了安全起见,

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

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

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

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

你不能直接访问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

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


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

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

在views.py

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

这是传递请求的示例

在serializers.py

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

来源于Rest框架