如何使用序列化器实现,当管理员用户请求时,序列化所有字段,而普通用户请求时,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/