リクエストメソッドに応じてかなり複雑なアクセス許可ロジックがあるため、CBV を使用しているときに同じ問題に遭遇しました。
私が思いついた解決策は、このページの下部にリストされているサードパーティの「rest_condition」アプリを使用することでした
http://www.django-rest-framework.org/api-guide/permissions
https://github.com/caxap/rest_condition
リクエスト メソッドに応じて各ブランチが実行されるように、パーミッション フロー ロジックを分割しただけです。
from rest_condition import And, Or, Not
class MyClassBasedView(APIView):
permission_classes = [Or(And(IsReadOnlyRequest, IsAllowedRetrieveThis, IsAllowedRetrieveThat),
And(IsPostRequest, IsAllowedToCreateThis, ...),
And(IsPutPatchRequest, ...),
And(IsDeleteRequest, ...)]
そのため、「Or」はリクエスト メソッドに応じてパーミッションのどのブランチを実行するかを決定し、「And」は受け入れられたリクエスト メソッドに関連するパーミッションをラップするため、パーミッションが付与されるにはすべてがパスする必要があります。各フロー内で「Or」、「And」、および「Not」を組み合わせて、さらに複雑な権限を作成することもできます。
各ブランチを実行するパーミッション クラスは次のようになります。
class IsReadyOnlyRequest(permissions.BasePermission):
def has_permission(self, request, view):
return request.method in permissions.SAFE_METHODS
class IsPostRequest(permissions.BasePermission):
def has_permission(self, request, view):
return request.method == "POST"
... #You get the idea