2017-12-15 4 views
0

Ich habe einen UserUpdateAPIView, darin ich die Benutzerinformationen bearbeiten:Wie kann ich den Superadmin Benutzer und Benutzer selbst auf eine API zugreifen lassen?

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() 

Die UserDetailSerializer:

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

Jetzt kann jeder Benutzer die UserUpdateAPIView zugreifen, so dass ihr ein schlechtes Design. Ich will nur den Super Admin und der Benutzer selbst kann auf die APIView zugreifen, wie man es implementiert?

Ich weiß, ich kann permissions = [IsAdminUser] verwenden, um den Admin-Benutzern den Zugriff auf diese API zu ermöglichen, aber ich möchte nur den Super-Admin-Benutzer und den Benutzer selbst zugreifen lassen.

Antwort

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

was ist das 'obj' dort? meinst du, es ist der angemeldete Benutzer? oder meinst du das obj sind die daten (benutzerdaten)? – fanhualuojin154873

+0

Obj das Objekt, das Sie abrufen, es ist Rückgabe von 'get_object' Methode.Hier Sie abgerufen wird Benutzer Instanz.Es kann jede Modellinstanz sein, abhängig von der Molde, die Sie in Ansichten abrufen. – Ykh

+0

Ich benutze 'django-1.11.5', wie man das is_authenticated importiert? – fanhualuojin154873

Verwandte Themen