Python Django restframework 自定义权限及使用,适用于自定义指定model的权限

现在我有个model,如下:

class PayItems(models.Model):
    """项目收费"""
    item_name = models.CharField(max_length=50, verbose_name='项目名称')
    charge_amount = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='收费金额')

    def __str__(self):
        return self.item_name

    class Meta:
        db_table = 'payitems'
        verbose_name = '项目收费'

现在为这个model自定义一个只读 或 只有拥有改model的所有权限的人,才可以进行post,put,delete操作

from rest_framework import permissions
from django.contrib.auth.models import Permission


class IsPyitemsOrReadOnly(permissions.BasePermission):
    """
        自定义权限,只读或有Pyitems的所有权限可以访问
    """

    def has_permission(self, request, view):
        # 只读method
        if request.method in permissions.SAFE_METHODS:
            return True

        # 得到pyitems的所有权限
        permission_list = []
        for i in Permission.objects.filter(content_type_id=11):
            permission_list.append('database.' + i.codename)
        permission_pyitems = tuple(permission_list)
        
        return request.user.has_perms(permission_pyitems)

其中

Permission.objects.filter(content_type_id=11)  # 11为django自带表auth_permisssion,所关联的django_content_type表的id

看图
这个是auth_permission表
Python Django restframework 自定义权限及使用,适用于自定义指定model的权限_第1张图片
这个是django_content_type表
Python Django restframework 自定义权限及使用,适用于自定义指定model的权限_第2张图片11就是这么来的。

user.has_perms(permission_pyitems)

这里的has_perms就是验证user有没有permission_pyitems权限,
permission_pyitems是一个元祖,其中写需要验证的权限

想要验证单独一个权限的话,用

user.has_perm(permission)

使用方式:

from rest_framework import permissions
导入 PayitemsSerializer 和 Pyitems

class PayItemsView(viewsets.ModelViewSet):
    """
        项目收费
    """

    # 权限认证
    permission_classes = (permissions.IsAuthenticated, IsPyitemsOrReadOnly)

    queryset = PayItems.objects.all()
    serializer_class = PayitemsSerializer

其中

permissions.IsAuthenticated  # 这个权限是只允许通过验证的用户访问

关于Django权限可以看我写的Django Web系列一 内置登录及默认权限的使用方法
本章完。

你可能感兴趣的:(Python Django restframework 自定义权限及使用,适用于自定义指定model的权限)