Django Rest框架自定义权限类,带有ManyToManyField

Django Rest框架自定义权限类,带有ManyToManyField,django,django-rest-framework,django-orm,django-rest-auth,Django,Django Rest Framework,Django Orm,Django Rest Auth,我正在尝试为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.CASCAD

我正在尝试为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
我很难编写权限类来检查是否是组管理员。我面临的问题是,这是一个多对多的领域


有人能帮我写这个吗?

您的数据结构错误 管理员成员应该是使用用户的m2m,而不是使用个人资料

为了获得许可,您必须进行如下查询 Group.objects.filter(admin\u auth\u user\u id=request.id)true-else返回flase


通过表使用它将减少您的工作量,并制作某种标志,让您知道请求用户是否是管理员(在用户模型中使用信号),因此每次您不必在数据库中启动查询。

您可以从
请求中获取
用户。我不知道如何从请求中获取
(它可能在请求负载中,这取决于您的设计),但假设您将
传递给权限类,那么它将是这样的:

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()
permission_classes = [partial(IsGroupAdmin, group)]
注意:如果您可以从请求中获取组,那么您不需要将
group
传递给
IsGroupAdmin
类,这将更容易。但是如果你不能做到这一点,并且你将只使用上面的权限类,你将需要
partial
函数。因此,您需要导入它:

from functools import partial
然后在视图中启动
permission\u类
,如下所示:

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()
permission_classes = [partial(IsGroupAdmin, group)]
但是,我建议您使用更简单的方法,因为我认为
必须位于
请求
中。假设
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
功能)