Как разбить несколько операторов if?

#django #django-rest-framework #django-rest-viewsets

#джанго #django-rest-фреймворк #django-отдых-наборы представлений

Вопрос:

У меня есть класс разрешений для моего набора представлений. Но в нем есть несколько операторов if, и операторы if также могут быть добавлены другие, если в набор представлений добавлено какое-либо действие.

Итак, как я могу оптимизировать свой код здесь для повышения производительности ?

 def has_permission(self, request, view):  user = request.user  if view.action in ["update", "partial_update"]:  return user.is_manager  if view.action == "create":  return user.is_creator  if view.action in ["list", "retrieve"]:  return user.is_viewer  if view.action == "destroy":  return user.is_admin  return False  

Здесь разные типы действий с представлением будут выполняться разными типами пользователей.

Комментарии:

1. Единственное сравнение, которое view.action содержится во всех допустимых действиях, сделает то, что вы хотите?

2. @IainShelvington разные view.action выполняются разными типами пользователей в зависимости от роли, поэтому

Ответ №1:

Ваш метод на самом деле хорош, но если вы ищете немного более лаконичный способ, попробуйте это:

 def has_permission(self, request, view):  user = request.user  actions = {"update": user.is_manager,  "partial_update": user.is_manager,  "create": user.is_creator,  "list": user.is_viewer,  "retrieve": user.is_viewer,  "destroy": user.is_admin}  return actions.get(view.action, False)  

Ответ №2:

Если ваш код хорошо работает, и вы просто хотите оптимизировать код, это может помочь вам:

 def has_permission(self, request, view):  if view.action in ["update", "partial_update","list", "retrieve","destroy","create"]:  return some_user  return False  

Комментарии:

1. some_user будет отличаться в зависимости от типов действий