2016-10-03 2 views
0

私のコードのパーミッションはオブジェクトとオブジェクトのリストとは異なります。django restフレームワーク内のオブジェクトとオブジェクトのリストを分離するためのパーミッションの適用との違い

のは、我々はUserの一つのモデルを持っているとしましょう:

class User(auth.AbstractBaseUser, auth.PermissionsMixin): 
    name = models.CharField(max_length=255, blank=True, null=True) 
    profile_status = models.CharField(max_length=255, blank=True, null=True) 

とデシベルで二列:

1. name = "Dennis", profile_status = "private" # (not "public") 
2. name = "Robert", profile_status = "private" # (not "public") 

とビューセット:

class UsersViewSet(viewsets.CreateListRetrieveUpdateViewSet): 
    queryset = models.User.objects.all()   # doesn't matter... 
    serializer_class = serializers.UserSerializer # doesn't matter... 
    filter_class = filters.UsersFilterSet   # doesn't matter... 
    permission_classes = [IsProfileAccessStatus('public'), 
          IsReadOnly] 

IsProfileAccessStatus('public') Djangoの許可がTrue場合を返します。オブジェクトのprofile_statusは 'p ublic ':

def IsProfileAccessStatus(access_status=''): 

    class IsProfileStatusOf(BasePermission): 
     def has_object_permission(self, request, view, obj): 
      return hasattr(obj, 'profile_status') and \ 
        obj.profile_status== access_status 

    return IsProfileStatusOf 

バックエンドが/api/users/とspeicific /api/users/:name/に1つのユーザーを返します。 /api/users/Dennis/ DRFで

異なる出力

IsProfileAccessStatus('public')権限記載例外を返します。だから大丈夫です。

しかし/api/users/のために、それは両方のオブジェクトを返します。

[ 
    { "name": "Dennis", "profile_status": "private" }, 
    { "name": "Robert", "profile_status": "private" } 
] 

Djangoの権限がこのように使われるのはなぜそこで質問がありますか?なぜすべてのインスタンスにdrf権限が適用されないのですか?

ありがとうございました!

答えて

1

すべてのユーザーに対してこれを行うのは計算上高価です。あなたが何十万というものを持っていたとしたら、想像してみてください。 docsで:オブジェクトレベルの権限の

制限のパフォーマンスを得るために

は オブジェクトのリストを返すときに汎用ビューが自動的にクエリセット内の各インスタンスに オブジェクトレベルの権限を適用しません理由があります。

オブジェクトレベルのアクセス許可を使用している場合は、 が適切にクエリーセットをフィルタリングして、表示することが許可されているインスタンスに対してユーザが の可視性しか持たないようにすることもできます。

回避するには、単にリストビューをオーバーライドし、エリック-SN @.filter(profile_status__exact='public'

+0

感謝を使用することはおそらくです!あなたの答えは本当に理にかなっています。 –

関連する問題