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

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


当前回答

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

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

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

user = validated_data['user']

其他回答

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

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

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

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

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

对于那些使用Django ORM并将用户添加为外键的人,他们将需要包括用户的整个对象,而我只能在create方法中做到这一点,并删除必选字段:

class PostSerializer(serializers.ModelSerializer):

def create(self, validated_data):
    
    request = self.context.get("request")
    
    post = Post()
    post.title = validated_data['title']
    post.article = validated_data['article']
    post.user = request.user

    post.save()

    return post

class Meta:
    model = Post
    fields = '__all__'
    extra_kwargs = {'user': {'required': False}}

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

是这样的:

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

或者为了安全起见,

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

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

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

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

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

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

user = validated_data['user']