You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Rest Framework中按自定义角色控制视图显示字段?

根据角色动态调整序列化字段

当然可以实现根据登录用户角色显示不同字段的需求,以下是两种常用方案:


方案一:单序列化器动态调整字段

通过重写序列化器的__init__方法,根据当前登录用户的角色动态添加或移除字段:

# Serializer.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'Role', 'Hash','is_staff')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 获取当前登录用户
        current_user = self.context.get('request').user
        # 非admin角色移除Hash字段
        if current_user.Role != 'admin':
            self.fields.pop('Hash')

视图无需修改,ModelViewSet会自动将请求上下文传递给序列化器,确保self.context['request']能获取到当前用户。


方案二:多序列化器在视图中切换

定义不同角色对应的序列化器,在视图中根据用户角色选择使用的序列化器:

# Serializer.py
class AdminUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'Role', 'Hash','is_staff')

class ManagerUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'Role','is_staff')
# View.py
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    permission_classes = [IsAuthenticated]

    def get_serializer_class(self):
        # 根据当前用户角色返回对应序列化器
        if self.request.user.Role == 'admin':
            return AdminUserSerializer
        return ManagerUserSerializer

注意事项

  • 确保User模型中的Role字段值与代码中的判断(如'admin')完全匹配,建议为Role字段添加choices参数规范可选值,避免拼写错误。
  • 两种方案都依赖请求上下文获取当前用户,视图已设置permission_classes = [IsAuthenticated],无需处理未登录用户的情况。

内容的提问来源于stack exchange,提问作者Stepan Kutaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:22:38