1

django rest フレームワーク ビューで django ガーディアンを使用してカスタム アクセス許可を設定したいと考えています。では成功しましたが、 では達成RetrieveModelMixinできませんでしたListModelMixin

次のようなアクセス許可クラスがあります。

class CustomPerm(permissions.BasePermission):
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated()

    def has_object_permission(self, request, view, object):
        if request.method == 'GET':
            if object.public is True:
                return True

            if object.user.is_staff is True:
                return True

            if 'read_object' in get_perms(request.user, object):
                return True

            return False

        if request.method == 'POST':
            #...

ここでもビューを簡略化しました:

@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication,))
@permission_classes((CustomPerm,))
class ObjectView(ListModelMixin,
                 RetrieveModelMixin,
                 viewsets.GenericViewSet):
    queryset = myObject.objects.all()
    serializer_class = ObjectSerializer

私が素朴に期待していた動作: CustomPermルールListModelMixinに従って、オブジェクト自体をフィルタリングできます。has_object_permission

しかし、それはそのようには機能しません。メソッドを作成し、独自のパーミッション ルールを適用することで、やりたいことを実行できget_querysetますが、不適切でひどいものに思えます。

より良い方法はありますか?ありがとう :)

PS: 私は何かが欠けていると確信しており、私の質問は素朴ですが、何がわかりません。

4

2 に答える 2

2

フレームワークがそのように機能しないのではないかと心配しています...パーミッションは(条件が満たされたときに)アクセスを拒否するためにありますが、オブジェクトをフィルタリングするためのものではありません。特定のオブジェクトを返す必要がある場合は、必要に応じて、現在のユーザーに応じてビュー (クエリセット) でそれらをフィルター処理する必要があります。

于 2015-10-13T23:34:15.290 に答える
0

オーバーライドは、方法によってはひどいものではありません...しかし、それは問題ではありません。

あなたが何をしたいのかをよく理解している場合は、カスタム権限を使用してクエリセットをフィルタリングすることです。

コードを明示的かつシンプルに保つために、ドキュメントのようにバックエンド フィルターをオーバーライドすることをお勧めします。

ただし、メソッドとメソッドfilter_querysetの両方に適用することに注意してくださいretrievelist

于 2015-10-13T13:18:18.140 に答える