Django Rest框架在创建时的权限检查

Django Rest框架在创建时的权限检查,django,django-rest-framework,django-guardian,Django,Django Rest Framework,Django Guardian,为什么django rest框架在创建对象时不检查对象权限?用户应该能够创建一个他们看不到、更新或删除的对象,这毫无意义(无论如何,对我来说)。目前,我将视图集子类化为 class CheckCreatePermissionsViewSet(ModelViewSet): def perform_create(self, serializer): ''' Called by create before calling serializer.save() '''

为什么django rest框架在创建对象时不检查对象权限?用户应该能够创建一个他们看不到、更新或删除的对象,这毫无意义(无论如何,对我来说)。目前,我将视图集子类化为

class CheckCreatePermissionsViewSet(ModelViewSet):
    def perform_create(self, serializer):
    '''
    Called by create before calling serializer.save()
    '''
    obj = serializer.save()
    try:
        self.check_object_permissions(obj)
    except:
        obj.delete()
        raise

为什么这不是默认实现的?这让我很头疼,我想不出有什么理由可以这样实现它。

如果您的意图是在用户没有特定权限的情况下不创建对象,您可以在Viewset中使用权限类,这样Viewset甚至不允许用户创建对象

为什么需要根据权限创建然后再次删除?。最好先检查权限,这样即使权限失败也不会创建对象

例如,您只希望管理员创建对象,您可以添加
permission\u classes=[permissions.isadmin]
到视图集,这样控件甚至不会进入perform\u create。如果普通用户试图创建对象,Viewset将发送403。希望这就是您想要的。

我发现在创建对象之前调用业务逻辑验证更自然、更明确,而不是创建对象并计算用户是否可以看到它来删除它

class CheckCreatePermissionsViewSet(ModelViewSet):
    def perform_create(self, serializer):
        try:
            business_rules_are_ok(serializer.data, user):
        except BusinessException:
            raise ValidationError(<content from BusinessException)
        serializer.save()
类检查CreatePermissionsViewSet(ModelViewSet):
def执行_创建(自、序列化程序):
尝试:
业务规则正常(serializer.data,user):
除业务例外:

raisevalidationerror(在我的方法中,我使用perform_create来完成您建议的工作。 但是,我没有创建和删除它,而是使用事务来处理它,代码:

class CheckCreatePermissionsViewSet(ModelViewSet):
    def check_object_permissions(self, request, obj):
        super(type(self), self).check_object_permissions(request, obj)
        #Additional logic....
        if not request.user.is_staff:
            raise PermissionDenied()


    def perform_create(self, serializer):
        with transaction.atomic():
            super(type(self), self).perform_create(serializer)
            obj = serializer.instance
            self.check_object_permissions(self.request, obj)

如果您认为,您应该使用
serializer.validated\u data
而不是
serializer.data