首页 文章

在django rest框架中对单独的对象和对象列表应用权限之间的区别

提问于
浏览
0

在我的代码中,权限对象和对象列表的结果不同 .

假设我们有一个 User 模型:

class User(auth.AbstractBaseUser, auth.PermissionsMixin):
    name = models.CharField(max_length=255, blank=True, null=True)
    profile_status = models.CharField(max_length=255, blank=True, null=True)

db中有两行:

1. name = "Dennis", profile_status = "private" # (not "public")
2. name = "Robert", profile_status = "private" # (not "public")

和视图集:

class UsersViewSet(viewsets.CreateListRetrieveUpdateViewSet):
    queryset = models.User.objects.all()            # doesn't matter...
    serializer_class = serializers.UserSerializer   # doesn't matter...
    filter_class = filters.UsersFilterSet           # doesn't matter...
    permission_classes = [IsProfileAccessStatus('public'),
                          IsReadOnly]

IsProfileAccessStatus('public') django权限返回 True ,如果object的 profile_status 等于'public':

def IsProfileAccessStatus(access_status=''):

    class IsProfileStatusOf(BasePermission):
        def has_object_permission(self, request, view, obj):
            return hasattr(obj, 'profile_status') and \
                   obj.profile_status== access_status

    return IsProfileStatusOf

后端返回 /api/users/ 处的用户和 /api/users/:name/ 处的特定用户 .

不同的输出

/api/users/Dennis/ drf根据 IsProfileAccessStatus('public') 权限返回异常 . 所以没关系 .

但是对于 /api/users/ ,它返回两个对象:

[
  { "name": "Dennis", "profile_status": "private" },
  { "name": "Robert", "profile_status": "private" }
]

所以问题是为什么django权限以这种方式使用?为什么不为每个实例应用drf权限?

谢谢!

1 回答

  • 1

    为每个用户执行此操作的计算成本很高 . 想象一下,如果你有成千上万的人 . 在docs

    对象级权限的限制出于性能原因,在返回对象列表时,通用视图不会自动将对象级权限应用于查询集中的每个实例 . 通常,当您使用对象级权限时,您还需要适当地过滤查询集,以确保用户只能看到允许他们查看的实例 .

    解决方法可能只是覆盖列表视图并使用 .filter(profile_status__exact='public'

相关问题