DRF - как реализовать разрешение на основе объекта на набор запросов? - PullRequest
0 голосов
/ 20 февраля 2019

Я реализовал DRF согласно документу.В какой-то момент я понял, что как только пользователь проходит аутентификацию, ему разрешено получать данные любого пользователя в системах.

Я применил фильтрацию согласно этому документу.

Я прочитал документ с разрешениями и не смог найти способ отфильтровать набор запросов на основе владельца.В одном из моих представлений я проверяю, является ли владелец тем же пользователем, который запросил.

У меня вопрос: нужно ли делать то же самое во всех наборах?или есть общий способ проверить это состояние?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Просто создайте файл разрешений и добавьте что-то вроде этого:

class IsOwner(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        # Instance must have an attribute named `owner`.
        return obj.owner == request.user

Затем в своем ViewSet используйте этот класс разрешений:

class MyViewSet(viewsets.ViewSet):
    permission_classes = (IsOwner,)

Теперь просто импортируйте ваши разрешенияфайл в любом месте, где вы хотите использовать эту логику, и вам не нужно дублировать код

0 голосов
/ 20 февраля 2019

Не уверен, если это лучший способ, но я делаю это, переопределяя get_queryset

def get_queryset(self):
    queryset = YOUR_MODEL.objects.filter(user_id=self.request.user.id)
    return queryset

Делая это, используя класс разрешения

class IsInUserHierarchy(permissons.BasePermission):
     def has_permission(self, request, view):
        return bool(isinstance(request.user, UserClassHierarchy))

Некоторые пояснения.IsInUserHierarchy класс очень похож на IsAdminUser.Он проверяет, находится ли request.user в требуемом классе (импорт UserClassHierarchy из моделей), используя простой метод python isinstance ()

...