如何使用自定义权限和APIView基于许可证实施用户访问?

问题描述

我有以下型号。

class Post(models.Model):
    content = models.TextField()

class User(AbstractUser):
    pen_name = models.Charfield()    

我想限制用户创建特定数量的帖子(比如说10个),并且不能超过此数量。另外,我希望该权限在某个日期之前到期。

这些模型具有代表性,我的原始模型具有更多字段,并且需要更多权限。但是对于所有这些,我基本上都需要限制计数和到期日期。我想通过使用权限来获得许可功能。因此,用户可以购买许可证在一年内发布n个帖子。

对于DRF中的APIViews和Permissions_class,我该如何实现?

解决方法

您可以为自定义post_number添加一个字段(User),并且该字段可以是IntegerFieldPositiveIntegerField,并且可以使其为limited

How to create an expiration date in my django model?

class User(AbstractBaseUser,PermissionsMixin):
    post_number = models.IntegerField()
    expiration_date = models.DateTimeField()

    more_restrictions = models.ManyToManyField(MyRestrictionModel)

    # rest of your code...

要获得更多限制,您可以与MyRestrictionModel建立联系,每当您向MyRestrictionModel添加字段时,您的User都会受到限制。

,

对于许可证,您可以创建许可证模型

class License(models.Model):
    code = models.Charfield()
    count = models.Integerfield()
    #other fields for license information

然后您可以将许可证放在用户模型的ManyToManyField中

class User(models.Model):
    ...
    licenses = models.ManyToManyField(License)
    ...

您还可以为M2M关系添加直通模型,以存储其他详细信息,例如许可证的购买日期,有效期,交易记录等。

然后在APIViews中可以使用DRF的自定义权限类

class MyPermissionClass(permissions.BasePermission):
    def has_permission(self,request,view):
        #process user's licenses to check permissions
class MyView(APIView):
    permission_classes = [MyPermissionClass,]