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/