【问题标题】:How to override get_serializer_class in APIView to change the serializer_class attribute in a class based view according to a specific condition.?如何覆盖 APIView 中的 get_serializer_class 以根据特定条件更改基于类的视图中的 serializer_class 属性。?
【发布时间】:2020-10-22 13:37:00
【问题描述】:
我要做的是像这样通过 get_serializer_class 方法设置 serializer_class 属性
if user.role==1 :
return adminLoanView
elif user.role==2 :
return agentLoanView
else:
return customerLoanView
在 def put() 函数中,使用这些基于登录用户的序列化程序来执行不同的功能,即管理员和代理只能编辑特定字段。并且客户不能编辑任何东西。
我仍然是 DRF 的初学者,所以请告诉我是否有其他更好的方法来做到这一点。
【问题讨论】:
标签:
django-rest-framework
django-views
django-class-based-views
django-serializer
【解决方案1】:
如果您使用 Django 自己的 User 模型,该模型具有 .is_superuser 和 .is_staff 字段,您可以像这样覆盖 get_serializer_class():
def get_serializer_class(self):
user = self.request.user
if user.is_superuser:
return SerializerClassWithHigherPermissions
elif user.is_staff:
return SerializerClassWithIntermediatePermissions
else:
return SerializerClassWithCustomerPermissions
如果您在User 模型上有一个带有OnetoOneField 的自定义用户模型,您可以通过视图中的user 实例访问该实例,然后检查权限条件。