python - 如何用序列化器实现,当管理员用户请求时,序列化所有字段,而普通用户请求时,序列化部分字段?

标签 python django django-rest-framework

如何使用序列化器实现,当管理员用户请求时,序列化所有字段,而普通用户请求时,Rest Framework中序列化部分字段?

在我的序列化器中:

class UserListSerializer(ModelSerializer):
    """
    user serializer
    """
    account = AccountSerializer(many=False, read_only=True)
    class Meta:
        model = User
        exclude = [
            'password',
        ]
...

class AccountSerializer(ModelSerializer):
    """
    user's accout
    """
    class Meta:
        model = Account
        exclude = [
            'total_charge',
            'total_consume',
        ]

在 View 中:

 class UserListAPIView(ListAPIView):
    """
    the user view 
    """
    queryset = User.objects.filter(is_admin=False, is_staff=False, is_superuser=False).exclude(status=4)
    serializer_class = UserListSerializer
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['username', 'qq', 'email']
    pagination_class = UserPageNumberPagination

    class Meta:
       ordering = ['-id']

我的要求是,当我使用普通用户请求 APIView 时,我想排除以下字段:

'total_charge','total_consume'

如果我使用管理员用户请求 APIView,我想序列化所有字段。

<小时/>

编辑

我添加了 get_serializer_class 方法:

class UserListAPIView(ListAPIView):
    """
    返回普通用户列表
    """
    queryset = User.objects.filter(is_admin=False, is_staff=False, is_superuser=False).exclude(status=4)

    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['username', 'qq', 'email']
    pagination_class = UserPageNumberPagination

    class Meta:
       ordering = ['-id']

    def get_serializer_class(self):
        if self.request.user.is_superuser:
            return UserAdminListSerializer
        else:
            return UserListSerializer

    serializer_class = get_serializer_class()  # if I put this line in the front of `def get_serializer_class(self)` I will get not find error.

当我运行服务器时,它在这里出现问题:

回溯:

 File "/Users/xsx/Desktop/xsx/Project/xss/qiyun_admin_usermanage/api/views.py", line 40, in <module>
    class UserListAPIView(ListAPIView):
  File "/Users/xsx/Desktop/xsx/Project/xss/qiyun_admin_usermanage/api/views.py", line 59, in UserListAPIView
    serializer_class = get_serializer_class()
TypeError: get_serializer_class() missing 1 required positional argument: 'self'

最佳答案

您可以创建两个序列化器并在 View 中覆盖get_serializer_class,如下所示。

def get_serializer_class(self):
    if self.request.user.is_superuser:
        return FullAccountSerializer
    return BasicAccountSerializer

关于python - 如何用序列化器实现,当管理员用户请求时,序列化所有字段,而普通用户请求时,序列化部分字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47261926/

相关文章:

Python 3.3 将列表中的字符串写入 txt 文件

python - 需要一个类似字节的对象,而不是 'str' - 错误

python - 用于 django 中迁移的自动数据库路由器

python - 如果任务没有运行超过 10 分钟,如何重新安排任务?

Django DRF 创建用户

python - Django REST 错误返回对象列表

python - 如何求解函数 y=f(x,y),即函数值取决于自身

Python:直接从提示符中读取用户输入

python - 为什么我的对象调用在我不打算传递参数的情况下传递参数?

python - 为什么 django-rest-frameworks request.data 有时是不可变的?