在我的代码中,权限对象和对象列表的结果不同 .
假设我们有一个 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 回答
为每个用户执行此操作的计算成本很高 . 想象一下,如果你有成千上万的人 . 在docs:
解决方法可能只是覆盖列表视图并使用
.filter(profile_status__exact='public'