В проекте в drf у меня есть конечная точка "api/v1/invoice/#id/", и я хочу дать доступ к просмотру только автору этого счета.
У меня есть конечная точка /api/v1/invoice/#id/
Я хочу, чтобы только автор этого счета-фактуры мог просматривать счет-фактуру. Или сотрудники должны иметь возможность просматривать этот счет-фактуру А суперпользователь должен иметь возможность просматривать, обновлять, удалять счет-фактуру
Я попробовал создать файл permissions.py в моем приложении:
permissions.py
from rest_framework.permissions import BasePermission
class AuthorGetStaffGetAdminAll(BasePermission):
edit_methods = ("PUT", "PATCH", "DELETE")
def has_permission(self, request, view):
if request.user.is_authenticated:
return True
return False
def has_object_permission(self, request, view, obj):
if request.user.is_superuser:
return True
if obj.author == request.user and request.method not in self.edit_methods:
return True
if request.user.is_staff and request.method not in self.edit_methods:
return True
return False
Поскольку вы используете APIView
, а не общий вид, вы должны вызвать check_object_permissions
явно, этот ответ все объясняет.
Ваш метод get должен выглядеть следующим образом:
def get(self, request, invoice_id):
invoice = Invoice.objects.get(id__iexact=invoice_id)
self.check_object_permissions(request, invoice) # This calls permissions
serializer = InvoiceSerializer(invoice)
return Response(serializer.data)
APIView не имеют проверки прав на уровне объекта. Вы можете обновить APIView с помощью RetrieveUpdateDestroyAPIView :
class InvoiceDisplayView(RetrieveUpdateDestroyAPIView):
lookup_field = 'invoice_id' # primary key
permissions_classes = [IsAuthenticatedAndOwner]
queryset = Invoice.objects.all()
serializer_class = InvoiceSerializer
если ваш первичный ключ - invoice_id, вы можете сделать это, и метод get не требуется, он сам по себе обслуживает put update delete и get, обычно первичный_ключ - это просто id или pk, в этом случае lookup_field будет 'id' или 'pk', и вам нужно обновить ваши урлы также :
urlpatterns = [
path('v1/invoices/<int:id>/', views.InvoiceDisplayView.as_view(), name="invoice_view"),
]