我正在尝试创建一个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):
...
因为默认情况下,卖家是经过身份验证的,并且权限会考虑到这一点。