2016-07-05 16 views
0

私はdjango restフレームワークでCRUDを持っており、私はパーミッションクラスを使用しているパーミッションを制御しています。 CRUDのために作成したパーミッションクラスを次に示します。これは、更新のためにうまく機能して、削除します。Django Rest Framework - 作成権限

class LinkAssetPermission(permissions.BasePermission): 
    message = 'Link access not allowed.' 

    def has_object_permission(self, request, view, obj): 
     return obj.content.delivery.owner == request.user and obj.content.delivery.can_change 

私の問題であれば、このクラスでは、私の作成ビューではうまく機能しないこと:

class AssetCreate(generics.CreateAPIView): 
    """ 
    Link a new asset 
    """ 
    queryset = Asset.objects.none() 
    serializer_class = AssetSerializer 
    permission_classes = (permissions.DjangoModelPermissions, LinkAssetPermission,) 

obj.content.delivery.can_change falseを返し、私が作成、更新またはモデルオブジェクトを削除することはできません。 obj.content.delivery.owner == request.userでも同じです。ユーザーが所有者である場合にのみ作成、更新、または削除することができます。これはすべて私が更新と削除のために望むように機能します。おそらく私はまだオブジェクトを持っていないので、それは私の質問の中核です。

オブジェクトは作成時に存在し、return Falseにはhas_object_permissionとしましたが、まだレコードを作成できます。

私は、挿入のための新しい権限クラスを作成する必要がありますか私のビューで何かを変更する必要がありますか? .get_object()方法はすなわち、特定のリソースがアクセスされている一般的な図で呼び出されるたびに任意の助け

+0

私が意味する、falseを返し、私は新しいレコードを作成することができますobj.content.delivery.can_changeこの方法。私の考えは、このcan_chanceがfalseを返すときです。レコードを作成、更新、削除することはできません。 –

+0

作成時には、 'create'を続ける前に' obj'が存在しません。どのobjを参照していますか? –

+0

実際には、私はデバッグしました。私もhas_object_permissionをfalseに戻そうとしましたが、レコードを作成することができます。 –

答えて

1

私は何をしなければならないのか分かりました。ここに私の新しいパーミッションクラスがあります:

class LinkAssetPermission(permissions.BasePermission): 
    message = 'Link access not allowed.' 

    def has_permission(self, request, view): 
     try: 
      content = Content.objects.get(pk=request.parser_context["kwargs"]["content_id"]) 
     except: 
      return False 

     return content.delivery.owner == request.user and content.delivery.can_change 

    def has_object_permission(self, request, view, obj): 
     return obj.content.delivery.owner == request.user and obj.content.delivery.can_change 

このメソッドを作成すると、has_object_permissionは考慮されませんが、has_permissionはあります。そこで、urls.pyから送信されたパラメータを取得し、必要なオブジェクトのプロパティを確認します。

おかげ

0

has_object_permissions()ため

おかげで呼び出されます。

ここで、すべてのdetailリクエスト(retrieveupdatedelete)は特定のリソース/オブジェクトにアクセスします。 createリクエストの場合、get_object()メソッドが呼び出されないため、あなたのケースでは機能しません。

createリクエストを処理する場合は、上記の2つの条件の検証がある別のシリアライザを作成できます。そして、あなたの許可クラスを変更してdetailリクエストのためだけに働かせてください。

+0

それだけでなく、私は依然としてCreateView –

+0

の答えを探しています。作成するための別のシリアライザを作成し、 'detail'要求のみを処理するためのアクセス権チェックを制限することもできます。 –