DjangoRest - я не могу установить разрешение для модели пользователя

В начале работы с приложением я хотел добавить разрешение для модели User, но потерпел неудачу.

Я создал модель User, базовый сериализатор и соответствующие разрешения Views.

Сценарий: Я хочу установить эти 2 разрешения, как указано ниже:

(a) Администратор может получить доступ к просмотру/редактированию всех пользователей.

(b) владелец объекта для просмотра/редактирования.

Я создал эти 2 конечные точки

path('customer/', UserListCreateAPIView.as_view()),
path('customer_info/<int:pk>/', UserRetrtieveUpdateDestroyAPIView.as_view()),

Любая помощь будет оценена по достоинству. Спасибо!

**Views.py**

class UserListCreateAPIView(generics.ListCreateAPIView):
    # permission_classes = [IsDeviceOwner]
    queryset = User.objects.all()
    # serializer_class = UserSerializer
    serializer_class = UserSerializer
    model = User
 
    def get_permissions(self):
        # allow non-authenticated user to create via POST
        return (AllowAny() if self.request.method == 'POST'
                else IsStaffOrTargetUser()),


class UserRetrtieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
    # permission_classes = [IsDeviceOwner]
    queryset = User.objects.all()
    
    # serializer_class = UserSerializer
    serializer_class = UserSerializer
    model = User
 
    def get_permissions(self):
        # allow non-authenticated user to create via POST
        return (AllowAny() if self.request.method == 'POST'
                else IsStaffOrTargetUser()),
**permissions.py**

class IsStaffOrTargetUser(BasePermission):
    
    def has_permission(self, request, view):
        # allow user to list all users if logged in user is staff
        return request.user or request.user.is_staff
 
    def has_object_permission(self, request, view, obj):
        # allow logged in user to view own details, allows staff to view all records
        return request.user.is_staff or obj == request.user

Я бы, вероятно, работал с этой логикой непосредственно в представлении, например:

class UserRetrtieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.none()
    serializer_class = UserSerializer
    model = User
    if request.user and request.user.is_staff:
        queryset = User.objects.all()
    elif request.user:
        queryset = User.objects.filter(pk=user.pk)
    

Сначала нужно добавить PermissionsMixin в вашу модель пользователя, чтобы получить доступ к разрешениям в админке django

model.py

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class CustomUser(AbstractBaseUser, PermissionsMixin): ...

для разрешения владения-> вам нужно проверить уникальный идентификатор, например, идентификатор пользователя или электронную почту

permission.py

class IsStaffOrTargetUser(BasePermission):
    
    def has_permission(self, request, view):
        # allow user to list all users if logged in user is staff
        return request.user or request.user.is_staff
 
    def has_object_permission(self, request, view, obj):records
        return request.user.is_staff or obj.email == request.user.email

для лучшего разрешения используйте django-guardian -> https://django-guardian.readthedocs.io/en/stable/

Вернуться на верх