gpt4 book ai didi

Django:如何限制模型列表对其所有者的访问权限?

转载 作者:行者123 更新时间:2023-12-04 17:51:14 25 4
gpt4 key购买 nike

我有一个 django 模型,我希望该模型只能由其所有者(创建模型的用户)访问。所以我创建了一个权限类如下

class IsOwnerOnly(permissions.BasePermission):


def has_object_permission(self, request, view, obj):

# Write permissions are only allowed to the owner of the snippet.
return obj.owner == request.user

并将此权限应用于模型 View 集
class ItemViewSet(viewsets.ModelViewSet):

queryset = Item.objects.all()
serializer_class = ItemSerializer
permission_classes = (IsOwnerOnly,)

def perform_create(self, serializer):
serializer.save(owner=self.request.user)

在访问单个项目时它可以工作,但即使如此,每个经过身份验证的用户都可以访问项目列表。那么我如何才能将项目访问权限限制为其所有者?

如图所示,我在设置页面中包含了 Tokenauthentication
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (

'rest_framework.authentication.TokenAuthentication',

),
}

并且该项目看起来像
class Item(models.Model):

name=models.CharField(max_length=30)
address=models.TextField()
owner = models.ForeignKey('auth.User', related_name='items', on_delete=models.CASCADE)

def __str__(self):
return self.name

最佳答案

您无法控制谁可以按所有者访问项目列表,如果您需要,则需要将 has_permission 覆盖到类 IsOwnerOnly,例如:

class IsAuthenticatedOwner(permissions.BasePermission):
def has_permission(self, request, view):
# work when your access /item/
if request.user and is_authenticated(request.user):
if request.user.id in [1, 2, 3]:
return True
else:
return False
else:
return False

def has_object_permission(self, request, view, obj):
# work when your access /item/item_id/
# Instance must have an attribute named `owner`.
return obj.owner == request.user

通知: has_permission工作时访问 /item/ (列表), has_object_permission工作时访问 /item/item_id/ (检索和更新)。

如果你想让用户只看到他创建的项目,简单如下:
class ItemsViewSet(ModelViewSet):
queryset = Items.objects.all()
serializer_class = ItemsSerializer
permission_classes = (IsAuthenticated)

def get_queryset(self):
queryset = self.get_queryset().filter(owner=self.request.user)
return queryset

关于Django:如何限制模型列表对其所有者的访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44625661/

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