Django Rest Framework get_permissions 需要一个权限或其他权限

我已经在 ListCreateAPIView 上定义了 get_permissions 方法并在那里应用了自定义权限,但我遇到了一个问题。

class ListSchoolStudents(generics.ListCreateAPIView,TeacherPermission):
    serializer_class = StudentSerializerForList
    permission_classes = [IsAuthenticated & TeacherPermission]
    
    def get_queryset(self):
        pk = self.kwargs['pk']
        
        return Student.objects.filter(school__id = pk).select_related('school','school_class').prefetch_related('subject')

    def get_permissions(self):
        if self.request.method in ['POST']:
            
            return [PrincipalPermission()]
        
        return [permissions.IsAuthenticated(),TeacherPermission()]

当我像这样定义它时,Principal 只能使用 POST 方法。但我也希望该用户能够使用其他方法。我试过这样的事情:

def get_permissions(self):
        if self.request.method in ['POST']:
            return [PrincipalPermission()]
        return [permissions.IsAuthenticated(),TeacherPermission(),PrincipalPermission() ]

但据我所知,它需要满足列表中的所有权限。

我正在寻找这样的东西

return [permissions.IsAuthenticated(),TeacherPermission() or PrincipalPermission() ]

我知道这种可能性存在于permission_classes中

permission_classes = [IsAuthenticated | TeacherPermission]

是否有一种简单的方法可以做到这一点,或者如果用户是教师或校长,我必须编写另一个自定义权限来授予权限?

a932182372 回答:Django Rest Framework get_permissions 需要一个权限或其他权限

在您提供的示例中,| 应应用于类,因此:

return [permissions.IsAuthenticated(),(TeacherPermission | PrincipalPermission)() ]

然而,有一种方法可以简化这一点,利用 @property 和简单属性与外部无法区分的事实。我会推荐这种模式来替代覆盖 get_permissions 方法。

class ListSchoolStudents(generics.ListCreateAPIView,TeacherPermission):
    serializer_class = StudentSerializerForList

    @property
    def permission_classes(self):
        if self.request.method in ['POST']:
            return [PrincipalPermission]
        return [IsAuthenticated,TeacherPermission | PrincipalPermission]
本文链接:https://www.f2er.com/2266.html

大家都在问