DRF - как реализовать объектное разрешение для набора запросов?

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
536
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не уверен, что это лучший способ, но я делаю это, переопределяя 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()

Да, это работает. Но я ищу общий способ сделать это.

Kishor Pawar 20.02.2019 12:09

@KishorPawar - что ты имеешь в виду, говоря «в общем». Хочешь немного Permisson class?

Headmaster 20.02.2019 12:12

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

Kishor Pawar 20.02.2019 12:14

Вы думали о создании класса разрешений, где has_permission функция return bool(isinstance(request.user, Child_User_Class))?

Headmaster 20.02.2019 12:26

Я попытался сделать то, что @Dalvtor сказал в своем ответе ниже. Как получить доступ к Child_User_Class в has_permission?

Kishor Pawar 20.02.2019 12:29

Давайте продолжить обсуждение в чате.

Kishor Pawar 20.02.2019 12:46

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

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,)

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

Это работает только тогда, когда у вас есть один объект для извлечения.

Kishor Pawar 20.02.2019 12:08

Другие вопросы по теме