python - 在 django rest 框架中结合 2 个自定义权限
问题描述
我有一个模型Showcase
,用户可以用来展示项目,还有一个协作模型,用户可以在其中将合作者添加到展示中。我正在尝试实现一个案例,展示中的管理员和协作中的用户可以删除该协作。
为了更好地解释,在展示模型中,有一个管理展示的管理员列表。他们还可以将合作者(通过Collaborator
模型)添加到展示中。有Collaborator
一个用户字段,即为展示做出贡献的用户。
我希望在添加协作者后,该用户可以删除自己(如果他不想成为展示的一部分),或者管理员可以删除该协作者(如果添加了错误的用户并想要删除那个橱窗里的他)
模型.py
class Showcase(models.Model):
title = models.CharField(max_length=50)
description = models.TextField(null=True)
skill_type = models.ForeignKey(Skill, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, related_name="Showcases")
content = models.TextField(null=True)
created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
voters = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="upvotes")
slug = models.SlugField(max_length=255, unique=True)
administrator = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="administrators", blank=True)
class Collaborator(models.Model):
post = models.ForeignKey(Showcase, on_delete=models.CASCADE, related_name="collaborated_showcases")
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE, related_name="collaborators")
skill = models.ForeignKey(Skill, on_delete=models.CASCADE, null=True, related_name="creative_type")
role = models.TextField(null=True)
created_on = models.DateTimeField(auto_now_add=True)
updated_on = models.DateTimeField(auto_now=True)
权限.py
class IsUser(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return False
return obj.user == request.user
class IsAdmin(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return False
return request.user.administrators.filter(pk=obj.pk).exists()
视图.py
class CollaboratorDeleteView(APIView):
'''
Allow Administrators to delete a collaborator to a showcase
or allow the collaborator user to be able to delete himself
'''
permission_classes = [IsAdmin]
def delete(self, request, pk):
collaborator = get_object_or_404(Collaborator, pk=pk)
showcase = collaborator.post
try:
self.check_object_permissions(request, showcase)
collaborator.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
except APIException:
return Response(status=status.HTTP_403_FORBIDDEN)
网址
path("collaborator/<int:pk>/delete/", qv.CollaboratorDeleteView.as_view(), name="collaborator-delete-view"),
现在我已经能够实现管理员可以删除协作者,但是我如何为Collaborator
模型中的用户添加另一个权限,以便能够通过相同的视图将自己作为协作者删除?
解决方案
您可以permission_classses
使用 & (and)、| 添加任意数量的权限来赋予属性 (or) 和 ~ (not) 符号 ( doc ):
class CollaboratorDeleteView(APIView):
'''
Allow Administrators to delete a collaborator to a showcase
or allow the collaborator user to be able to delete himself
'''
permission_classes = [IsAdmin|IsUser]
这两个权限现在都可以使用OR
逻辑。
推荐阅读
- python - 另一个列表中值列表的频率总和
- c# - 为什么使用 NPOI 创建后 docx 文件损坏
- javascript - Javascript 日期 - 设置 UTC 月份
- javascript - 使用 webpack-merge 将加载器添加到规则 `use` 数组中
- java - 添加绑定以进行验证
- unit-testing - 如何模拟 rxjs 6 webSocket 函数进行单元测试?
- vert.x - Vertx 3.6.3:带有 DeliveryOptions 的 eventBus.send() 失败
- animation - Xamarin.Forms ScrollView - 随着它的扩展动画它的增长
- spring-boot - 错误 - 兔子模板发布确认 - 回复代码 = 403,回复文本 = ACCESS_REFUSED - 无法发布到内部交换
- google-chrome-extension - 内容脚本大量计算导致性能不佳(chrome扩展)