Django rest 框架用户模型权限

时间:2021-06-11 04:47:30

标签: python django django-rest-framework

我正在尝试创建一个网络应用程序,我需要有不同类型的用户,买方和卖方。

class User(AbstractUser):
    isBuyer = models.BooleanField(default=False)
    isSeller = models.BooleanField(default=False)


class Buyer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

class Seller(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

我认为模型很好(如果有更好的方法请告诉我)。 User 模型中的布尔值是必需的还是有其他方法可以区分它们?

此外,由于我使用的是其余框架,因此我想使用权限类。类似的东西,

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated, IsAdminUser

@api_view(['POST'])
@permission_classes([IsAuthenticated, IsSeller])
def deleteProduct(req):

如何制作 IsSeller 权限类?

2 个答案:

答案 0 :(得分:1)

试试这个:

from rest_framework.permissions import IsAuthenticated

class IsSeller(IsAuthenticated):
    def has_permission(self, request, view):
        is_authenticated = super().has_permission(request, view)

        if not is_authenticated:
            return False

        return request.user.isSeller

这将检查用户是否已通过身份验证,如果是,则将检查用户是否是卖家,因此您只能将此类放在视图中的 permission_classes 中。

答案 1 :(得分:0)

关于您的模型的第一点:如果类买家和卖家没有更多字段,则不需要具有不同的类。使用这些模型将导致对数据库进行多次查询:您正在尝试将这些 SQL 查询减少到最低限度。

此外,如果用户是买家或卖家,则不需要有 2 个布尔值。只有一个就足够了。 isSeller = models.BooleanField(default=False, help_text='By default everyone is a buyer')

关于权限:

from rest_framework import permissions

class IsASeller(permissions.BasePermission):
    def has_permission(self, request, view):
        return bool(request.user
                    and request.user.is_authenticated
                    and request.user.isSeller)

并且视图可以简化为:

@permission_classes([IsSeller])
def deleteProduct(req):
    ...

因为默认情况下卖家是经过身份验证的,并且权限会考虑到这一点。