Как переопределить get_serializer_class в APIView, чтобы изменить атрибут serializer_class в представлении на основе класса в соответствии с определенным условием.?

#django-rest-framework #django-views #django-class-based-views #django-serializer

#django-rest-framework #django-представления #django-class-based-views #django-serializer

Вопрос:

То, что я пытаюсь сделать, это установить атрибут serializer_class через метод get_serializer_class следующим образом

     if user.role==1 :
      return adminLoanView 
    elif user.role==2 :
      return agentLoanView 
    else:
      return customerLoanView
  

И в функции def put() используйте эти сериализаторы на основе зарегистрированного пользователя для выполнения другой функции, то есть администратор и агент могут редактировать только определенные поля. И клиент не может ничего редактировать.
Я все еще новичок в DRF, поэтому дайте мне знать, если есть какой-либо другой лучший способ сделать это.

Ответ №1:

Если вы используете собственную User модель Django, в которой есть .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
  

Если у вас есть пользовательская модель пользователя с a OnetoOneField в User модели, вы можете получить доступ к этому экземпляру через user экземпляр в представлении, а затем проверить условия разрешений.