【问题标题】:How to break multiple if statements?如何打破多个if语句?
【发布时间】:2025-10-29 19:35:01
【问题描述】:

我的视图集有一个权限类。但是它有多个 if 语句,如果在 viewset 中添加了一些动作,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

在这里,不同类型的用户将执行不同类型的视图操作。

【问题讨论】:

  • 一个比较 view.action 在所有有效操作中会做你想要的吗?
  • @IainShelvington 不同的view.action 是由不同的用户类型根据角色执行的,所以

标签: django django-rest-framework django-rest-viewsets


【解决方案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
    

    【讨论】:

    • some_user 会因操作类型而异