首页 > 解决方案 > 带有 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

我在编写权限类来检查是否是组管理员时遇到了麻烦。我正面临问题,因为这是多对多的领域。

谁能帮我写这个?

标签: djangodjango-rest-frameworkdjango-ormdjango-rest-auth

解决方案


你可以Userrequest.user. 我不知道您如何获取Groupfrom 请求(它可能在请求有效负载中,这取决于您的设计)但假设您将其传递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()

注意:如果您可以从请求中获取组,那么您不需要传递groupIsGroupAdmin班级,这会容易得多。但是如果你不能这样做并且你将只使用上面的权限类,你将需要这个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功能)


推荐阅读