如何将当前已认证用户传递给Django REST Framework序列化器
解决方案
有两种DRF官方推荐的优雅实现方式,均符合框架设计规范:
方案1:重写视图的perform_create方法(推荐单视图场景使用)
这是最常用的实现方式,逻辑清晰,适配单个视图的场景:
- 首先调整序列化器,将
user字段设为只读,避免前端传入非法值覆盖后端赋值:
class ProfessionalSerializer(serializers.ModelSerializer): user = serializers.ReadOnlyField() class Meta: model = Professional fields = '__all__'
- 重写创建视图的
perform_create方法,在序列化器保存时注入当前已认证用户:
from rest_framework.permissions import IsAuthenticated class CreateProfessional(generics.CreateAPIView): serializer_class = ProfessionalSerializer # 新增权限校验,确保只有已登录用户可以访问接口,避免拿到匿名用户 permission_classes = [IsAuthenticated] def perform_create(self, serializer): serializer.save(user=self.request.user)
方案2:重写序列化器的create方法(推荐多视图复用场景使用)
如果多个视图都用到该序列化器创建Professional实例,可以把赋值逻辑收敛到序列化器内,避免重复代码:
class ProfessionalSerializer(serializers.ModelSerializer): user = serializers.ReadOnlyField() class Meta: model = Professional fields = '__all__' def create(self, validated_data): # 序列化器默认会携带request上下文,直接取当前登录用户注入 validated_data['user'] = self.context['request'].user return super().create(validated_data)
使用该方案时,视图不需要额外修改,只要保证视图配置了IsAuthenticated权限即可。
内容的提问来源于stack exchange,提问作者Luis Alfonso Buelvas Betancour
相关产品推荐
相关产品推荐

