В проекте в 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"),
]
Вернуться на верх