0

私はdjangoモデルを持っています。そのモデルに所有者(モデルを作成したユーザー)のみがアクセスできるようにしたいと思います。だから私はDjango:モデル所有者へのモデルアクセス許可を制限する方法は?

class IsOwnerOnly(permissions.BasePermission): 


def has_object_permission(self, request, view, obj): 

    # Write permissions are only allowed to the owner of the snippet. 
    return obj.owner == request.user 

を次のようにパーミッションクラスを作成し、

class ItemViewSet(viewsets.ModelViewSet): 

    queryset = Item.objects.all() 
    serializer_class = ItemSerializer 
    permission_classes = (IsOwnerOnly,) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

それが動作する単一の項目にアクセスしながらmodelviewset

にこの権限を適用し、しかし、その後も、すべての認証されたユーザーは、項目のリストにアクセスすることができます。だから私はどのように私はその所有者だけにアイテムのアクセスを制限することができますか?

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated', 
), 
'DEFAULT_AUTHENTICATION_CLASSES': (

    'rest_framework.authentication.TokenAuthentication', 

), 
} 

を示したように、私は設定ページにTokenauthenticationが含まれているし、あなたの場合はどう項目が

class Item(models.Model): 

    name=models.CharField(max_length=30) 
    address=models.TextField() 
    owner = models.ForeignKey('auth.User', related_name='items', on_delete=models.CASCADE) 

    def __str__(self): 
     return self.name 
+0

'リターンobj.ownerは== request.user'、フィールドは' Item'をモデル化するowner' 'のですか?あなたが何であれ、 'hasOpermission'をクラス' IsOwnerOnly'にオーバーライドする必要がある場合は、オーナーによってアイテムリストにアクセスできる人を制御できません。 – Ykh

+0

yup。私は今それを含めているフィールド –

+0

です。 plsチェック –

答えて

0

のように見えますが、所有者がアイテムリストにアクセスすることができます誰を制御することはできません

class IsAuthenticatedOwner(permissions.BasePermission): 
    def has_permission(self, request, view): 
     # work when your access /item/ 
     if request.user and is_authenticated(request.user): 
      if request.user.id in [1, 2, 3]: 
       return True 
      else: 
       return False 
     else: 
      return False 

    def has_object_permission(self, request, view, obj): 
     # work when your access /item/item_id/ 
     # Instance must have an attribute named `owner`. 
     return obj.owner == request.user 

Notice:のように、クラスIsOwnerOnlyにhas_permissionをオーバーライドする必要があります。あなたのアクセス/item/(リスト)、has_object_permissionがあなたのアクセス/item/item_id/(検索し、更新)時に動作するとき、の仕事。

ユーザーが自分が作成した項目だけを見るようにしたい場合は、シンプル:

class ItemsViewSet(ModelViewSet): 
    queryset = Items.objects.all() 
    serializer_class = ItemsSerializer 
    permission_classes = (IsAuthenticated) 

    def get_queryset(self): 
     queryset = self.get_queryset().filter(owner=self.request.user) 
     return queryset 
+0

ok。しかし、私が必要とするのは、その所有者だけに許可を限定することです。 –

+0

/item/item_idにアクセスする際にそれを行うことはできますが、/ item/ –

+0

にアクセスすることはできません。 – Ykh

関連する問題