如何在django-rest-framework中设置权限,以便会话用户只能列出具有该用户外键的对象?

Dus*_*att 2 python django django-rest-framework

我有这样的模特:

class TheModel(models.Model):
    name = models.CharField(max_length=10)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL)
Run Code Online (Sandbox Code Playgroud)

我想创建一个API视图,列出所有等于的TheModel对象.TheModel.ownerrequest.user

我想我可以通过覆盖来做到这一点get_queryset,但似乎我应该使用自定义BasePermission.问题是它看起来不像BasePermission.has_object_permission在列表视图中的每个对象上运行.唯一可以运行的是BasePermission.has_permission.我测试了这个: -

class TheModelViewSet(viewsets.ModelViewSet):
    model = TheModel
    permission_classes = [IsOwner]

class IsOwner(permissions.BasePermission):
    def has_permission(self, request, view):
        print("checking has permission for {}".format(request.user))
        return True

    def has_object_permission(self, request, view, obj):
        print("checking permission for {} on {}").format(request.user, obj.user)

        return obj.owner == request.user
Run Code Online (Sandbox Code Playgroud)

印刷的唯一东西是来自的东西IsOwner.has_permission.

也许我只是在思考它而我应该只使用自定义查询集而不是使用权限?

knb*_*nbk 5

官方文档建议使用自定义get_queryset在这个用例方法,而这正是我要做什么.

权限对象has_object_permission仅在单个对象的视图上调用时运行,因此无法强制实施列表视图的权限.

基本上,您不是试图允许或拒绝访问,而是尝试过滤结果.在数据库级别上过滤是最快,最简单,最安全(最不容易出错)的选项.权限框架仅用于允许或拒绝对对象或完整对象组的访问,不会过滤特定响应的内容.该get_queryset方法用于过滤特定响应的内容,并且应该如此使用.