通过 Django Rest Framework 中的相关模型强制执行权限

And*_*her 7 django django-rest-framework

我正在努力为使用 Django REST Framework 构建的 API 构建权限。假设我有以下模型:

from django.db import models

class Study(models.Model):
   pass

class Result(models.Model):
   study = models.ForeignKey(Study)
   value = models.IntegerField(null=False)
Run Code Online (Sandbox Code Playgroud)

我有这两个模型的基本序列化器和视图。我将使用每个对象的权限来授予用户对一项或多项研究的访问权限。我希望用户只能查看他们有权限的Resulta 。Study我可以想到两种方法来做到这一点,但似乎都不理想:

  1. 使 s上的每个对象权限Result与 保持同步Study。这只是一个不可能的事情,因为我们想要Study永远成为真相的来源。
  2. 编写一个自定义权限类,Study当用户尝试访问Result. 这实际上还不错,但我找不到其他人这样做的例子,这让我觉得我的想法可能从根本上是错误的。

是否有现有的解决方案?或者自定义权限类是可行的方法吗?如果是这样,您是否有其他人以这种方式实施的例子?

Suh*_*yap -1

正如您所说,您可以按照第二种方式进行自定义权限:并将该权限包含在您的视图中:

我正在考虑您的研究模型与一些参数课程,基于此我正在编写您可以考虑研究模型中任何元素的解决方案

模型.py

from django.db import models

class Study(models.Model):
  course = models.CharField(max_length=50)

class Result(models.Model):
   study = models.ForeignKey(Study)
   value = models.IntegerField(null=False)
Run Code Online (Sandbox Code Playgroud)

在许可.py

 from rest_framework import permissions

    class ResultOrReadOnly(permissions.BasePermission):
    
        def has_object_permission(self, request, view, obj):
            if request.method in permissions.SAFE_METHODS and obj.study.course == request.GET.get('course') :

                # read only requests

                return True
            else:

                # other requests such as post, patch, put 

                return obj.study == request.GET.get('course')
Run Code Online (Sandbox Code Playgroud)

并包括,

class ReviewDetail(viewsets.ViewSet):

     permission_classes =[ResultOrReadOnly]
Run Code Online (Sandbox Code Playgroud)

在 urls.py 中,

修改为接受URL参数当然