django - 带有 ManyToManyField 的 Django Rest Framework 自定义权限类
问题描述
我正在尝试为 django rest api 视图编写一个权限类。
这是我的模型
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
name = models.CharField(max_length=50)
auth_user = models.OneToOneField(User, on_delete=models.CASCADE)
class Group(models.Model):
admin = models.ManyToManyField(Profile, related_name='g_admin')
members = models.ManyToManyField(Profile, related_name='g_mess')
我希望只有组管理员可以在特定页面中执行操作,为此我正在编写一个权限类:
class IsGroupAdmin(BasePermission):
"""
Allows access only to Group Admin.
"""
def has_permission(self, request, view):
# return bool() do something here
我在编写权限类来检查是否是组管理员时遇到了麻烦。我正面临问题,因为这是多对多的领域。
谁能帮我写这个?
解决方案
你可以User
从request.user
. 我不知道您如何获取Group
from 请求(它可能在请求有效负载中,这取决于您的设计)但假设您将其传递Group
给权限类,那么它将是这样的:
class IsGroupAdmin(BasePermission):
"""
Allows access only to Group Admin.
"""
def __init__(self, group):
super().__init__()
self.group = group
def has_permission(self, request, view):
return self.group.profile_set.filter(auth_user=request.user).any()
注意:如果您可以从请求中获取组,那么您不需要传递group
给IsGroupAdmin
班级,这会容易得多。但是如果你不能这样做并且你将只使用上面的权限类,你将需要这个partial
函数。所以你需要导入它:
from functools import partial
然后在视图中,permission_classes
像这样启动:
permission_classes = [partial(IsGroupAdmin, group)]
但是,我建议您使用更简单的方法,因为我认为group
必须在request
. 假设它group
在请求有效负载中,那么您必须实现IsGroupAdmin
为:
class IsGroupAdmin(BasePermission):
"""
Allows access only to Group Admin.
"""
def has_permission(self, request, view):
group = request.data.get('group', '')
return group.profile_set.filter(auth_user=request.user).any()
并像普通权限一样使用它。(无需使用partial
功能)
推荐阅读
- jquery - 为什么 JQuery ui 标签不能使用 html
- jquery - Wordpress jquery 1.12.4的哈希不匹配
- c - Head First C比较操作
- swift - Enum parameter for function
- ssl - 如何通过 Javascript 将 TLS 与 Paho MQTT 一起使用?
- html - 强或b标签html在模态反应js中不起作用
- java - Restful API 服务器没有找到目标资源的表示
- php - 检查 UTF-8 字符是否需要最多三个字节
- python - 在单个 docker 容器中运行多个烧瓶应用程序的最佳方法
- php - 在 PhP 中发布复选框