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



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

假设我们有一个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)

数据库中的两行:

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]

如果对象的profile_status等于"public",则IsProfileAccessStatus('public') django权限返回True

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权限?

谢谢!

为每个用户这样做在计算上是昂贵的。想象一下,如果你有几十万个。在文档中:

对象级别权限的限制

出于性能原因,常规视图不会自动应用返回时对查询集中每个实例的对象级权限对象列表。

通常,当您使用对象级权限时,您还需要适当地筛选查询集,以确保用户只有对允许他们查看的实例的可见性。

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

最新更新