Django rest框架用户模型权限



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

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

我认为这些模型很好(如果有更好的方法,请告诉我(。用户模型中的布尔值是必要的,还是有其他方法来区分它们?

另外,由于我使用的是rest框架,所以我想使用权限类。类似

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权限类?

试试这个:

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中。

关于您的模型的第一点:如果类Buyer和Seller没有更多的字段,则不需要有不同的类。使用这些模型将导致对数据库的多次查询:您正试图将这些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):
...

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

最新更新