gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:54:54 25 4
gpt4 key购买 nike

我有这样的模型:

class TheModel(models.Model):
name = models.CharField(max_length=10)
owner = models.ForeignKey(settings.AUTH_USER_MODEL)

我想创建一个 API View ,其中列出所有 TheModel 对象,其中 TheModel.owner 等于 request.user

我想我可以通过覆盖 get_queryset 来做到这一点,但我似乎应该使用自定义 BasePermission。问题是它看起来不像 BasePermission.has_object_permission 在 ListView 中的每个对象上运行。唯一运行的是 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

唯一打印的是来自 IsOwner.has_permission 的内容。

也许我只是想多了,我应该只使用自定义查询集而不是使用权限?

最佳答案

official documentation建议在此用例中使用自定义 get_queryset 方法,这正是我会做的。

权限对象的 has_object_permission 仅在针对单个对象的 View 上调用时运行,因此无法强制执行 ListView 的权限。

基本上,您不是要允许或拒绝访问,而是要过滤结果。在数据库级别进行过滤是最快、最简单和最安全(最不容易出错)的选项。权限框架仅用于允许或拒绝访问一个对象或一个完整的对象组,而不用于过滤特定响应的内容。 get_queryset 方法用于过滤特定响应的内容,应按原样使用。

关于python - 如何在 django-rest-framework 中设置权限,以便 session 用户只能列出具有该用户外键的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23447157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com