Python 如何将自定义值从DRF ModelViewSet传递到权限类?

Python 如何将自定义值从DRF ModelViewSet传递到权限类?,python,django,django-rest-framework,permissions,django-rest-viewsets,Python,Django,Django Rest Framework,Permissions,Django Rest Viewsets,我已经设置了一个可从多个视图重用的应用程序,在该应用程序中,一些用户代表其他用户拥有类似所有权的权限: class IsOwnerLike(permissions.BasePermission): def has_permission(self, request, view): if ( user_is_owner(request.user, request.data["owned_by"]) | user_is_owner

我已经设置了一个可从多个视图重用的应用程序,在该应用程序中,一些用户代表其他用户拥有类似所有权的权限:

class IsOwnerLike(permissions.BasePermission):
    def has_permission(self, request, view):
        if (
            user_is_owner(request.user, request.data["owned_by"])
            | user_is_owner_like(request.user, request.data["owned_by"])
        ):
            return True

        return False
这与一个ModelViewSet的预期效果相同

但是,由于遗留的原因,进入不同视图的不同请求可能没有“owned_by”数据元素——它可能被称为“owned”、“owner”、“created_by”等——因此,我无法按书面形式重用此自定义权限


在视图集中抽象事物的正确方法是什么,以规范传递给自定义权限类的数据?这可以做到吗,或者我应该考虑以不同的方式处理这些权限吗?

您应该使用from has\u object\u permission for object check for model access permission,如下所示:

    def has_object_permission(self, request, view, obj):
        if hasattr(obj, 'owner'):
           if obj.user == request.user:
              return True
        return False
您可以使用模型所有者字段名更改所有者

对于将所有者kwargs传递到权限类,您应该编写custommModelViewSet,并从ModelViewSet继承,并重写get_permissions()方法,以找到解决方案

我可以向视图添加自定义属性:

class ViewOne(ModelViewSet):
    ownership_fieldname = "owned_by"
    permission_classes = [IsOwnerLike]

    ...

class ViewTwo(ModelViewSet):
    ownership_fieldname = "owner"
    permission_classes = [IsOwnerLike]
    ...

然后在权限中访问它:

class IsOwnerLike(permissions.BasePermission):
    def has_permission(self, request, view):
        if (
            user_is_owner(request.user, request.data[view.ownership_fieldname])
            | user_is_owner_like(request.user, request.data[view.ownership_fieldname])
        ):
            return True

        return False

如果您使用created_,那么它将无法工作,您必须创建不同的权限类谢谢您的回复!在本例中,我正在处理一个POST请求,因此对象还不存在。此权限测试旨在确定用户创建对象的权限。因此,您可以在“执行创建”中调用“检查权限”