我正在尝试创建一个网络应用程序,我需要有不同类型的用户,买方和卖方。
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 权限类?
答案 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):
...
因为默认情况下卖家是经过身份验证的,并且权限会考虑到这一点。