2017-12-15 5 views
0

私はそれで私は、ユーザーの情報を編集することができ、UserUpdateAPIViewを持っている:スーパーユーザーとユーザー自身がAPIにアクセスできるようにするにはどうすればよいですか?

class UserUpdateAPIView(RetrieveUpdateAPIView): 
    queryset = User.objects.filter(is_admin=False, is_staff=False, is_superuser=False).exclude(status=4) 
    serializer_class = UserDetailSerializer 
    lookup_field = "username" 
    def perform_update(self, serializer): 
     serializer.save() 

UserDetailSerializer

class UserDetailSerializer(ModelSerializer): 
""" 
user detail 
""" 
class Meta: 
    model = User 
    exclude = [ 
     'password', 
    ] 
    depth = 1 

を、すべてのユーザーがUserUpdateAPIViewので、その悪いデザインにアクセスすることができます。私はスーパー管理者とユーザー自身がAPIViewにアクセスできるようにしたい、どのように実装するのですか?

私はpermissions = [IsAdminUser]を使用して管理者ユーザーがこのAPIにアクセスできるようにすることができますが、スーパー管理ユーザーとそのユーザー自身がアクセスできるようにしたいと考えています。

答えて

1
from rest_framework import permissions 
from rest_framework.compat import is_authenticated 

class IsAdminUserOrSelf(permissions.BasePermission): 

    def has_object_permission(self, request, view, obj): 
     # this methid is called in get_object method. 
     # obj mean the object you retrieve.Here you retrieved is User instance. 
     # It's can be any model instance,depend on the Molde you Retrieve in views. 

     # if you want everyone can see user info 
     if request.method in permissions.SAFE_METHODS: 
      return True 
     # if you use Django2.0 is_authenticated(request.user) should be changed to request.user.is_authenticated 
     if request.user and is_authenticated(request.user): 
      # is self or is superuser 
      return obj == request.user or request.user.is_superuser 
     else: 
      return False 

class UserUpdateAPIView(RetrieveUpdateAPIView): 
    permissions = [IsAdminUserOrSelf,] 
    queryset = User.objects.filter(is_admin=False, is_staff=False, is_superuser=False).exclude(status=4) 
    serializer_class = UserDetailSerializer 
    lookup_field = "username" 
    def perform_update(self, serializer): 
     serializer.save() 
+0

「obj」とはどういう意味ですか?あなたはログインしたユーザーであることを意味しますか?または 'obj'がデータ(ユーザのデータ)であることを意味しますか? – fanhualuojin154873

+0

objは、取得するオブジェクトを意味し、 'get_object'メソッドによって返されます。ここで取得されるのは、Userインスタンスです。これは、任意のモデルインスタンスであり、ビューで取得するMoldeに依存します。 – Ykh

+0

私は 'django-1.11.5'を使って、is_authenticatedをどのようにインポートするのですか? – fanhualuojin154873

関連する問題