Я использую Django REST Framework для доступа к ресурсу 'user'.
Поскольку информация пользователя является личной, я не хочу, чтобы запрос GET перечислил каждого пользователя в системе, ЕСЛИ они являются администратором.
Если пользователь указывает свой идентификатор, и они вошли в систему, я бы хотел, чтобы они могли просматривать их данные и изменять их (PUT POST DELETE), если это необходимо.
Итак, вкратце, запретите метод GET для всех, кто не является администратором, и разрешите GET POST DELETE PUT при входе в систему при просмотре их информации.
поэтому я создал собственный класс разрешений:
class UserPermissions(permissions.BasePermission):
    """
    Owners of the object or admins can do anything.
    Everyone else can do nothing.
"""
    def has_permission(self, request, view):
        # if admin: True otherwise False
    def has_object_permission(self, request, view, obj):
        # if request.user is the same user that is contained within the obj then allow
Это не сработало. После некоторой отладки я обнаружил, что он сначала проверяет has_permission, THEN проверяет has_object_permission. Поэтому, если мы не преодолеем этот первый барьер GET/user/, тогда он даже не рассмотрит следующий GET/user/id.
Итак, кто-нибудь знает, как я собираюсь заставить это работать?
Спасибо:)
EDIT:
Я использовал ModelViewSets, у которых есть эта проблема, как я описал.
Но если вы разделили функциональность "Список" с помощью "Детали", вы можете предоставить им отдельные классы разрешений:
class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes=(UserPermissionsAll,)
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes=(UserPermissionsObj,)
class UserPermissionsAll(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
    def has_permission(self, request, view):
        if request.user.is_staff:
            return True
        else:
            return False
class UserPermissionsObj(permissions.BasePermission):
"""
Owners of the object or admins can do anything.
Everyone else can do nothing.
"""
    def has_object_permission(self, request, view, obj):
        if request.user.is_staff:
            return True
        return obj == request.user