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





Не уверен, что это лучший способ, но я делаю это, переопределяя 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()
@KishorPawar - что ты имеешь в виду, говоря «в общем». Хочешь немного Permisson class?
да. На самом деле у меня есть иерархия пользователей. Как родительский и дочерний пользователь. Я хочу разрешить любому пользователю извлекать данные, принадлежащие любому пользователю в той же иерархии.
Вы думали о создании класса разрешений, где has_permission функция return bool(isinstance(request.user, Child_User_Class))?
Я попытался сделать то, что @Dalvtor сказал в своем ответе ниже. Как получить доступ к Child_User_Class в has_permission?
Давайте продолжить обсуждение в чате.
Просто создайте файл разрешений и добавьте что-то вроде этого:
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,)
Теперь просто импортируйте файл разрешений в любое место, где вы хотите использовать эту логику, и вам не нужно дублировать какой-либо код.
Это работает только тогда, когда у вас есть один объект для извлечения.
Да, это работает. Но я ищу общий способ сделать это.