2017-02-22 25 views
2
разрешения уровня

объекта

Пример из http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#object-level-permissionsДжанго: права доступа на уровне объекта DRY

class IsOwnerOrReadOnly(permissions.BasePermission): 
    """ 
    Custom permission to only allow owners of an object to edit it. 
    """ 

    def has_object_permission(self, request, view, obj): 
     # Read permissions are allowed to any request, 
     # so we'll always allow GET, HEAD or OPTIONS requests. 
     if request.method in permissions.SAFE_METHODS: 
      return True 

     # Write permissions are only allowed to the owner of the snippet. 
     return obj.owner == request.user 

Моя потребность: QuerySet всех объектов пользователь может редактировать

Я хочу иметь Джанго-ОРМ QuerySet который содержит все объекты, которые данный пользователь может редактировать.

Я предполагаю, что я мог бы решить эту проблему путем создания сложного Джанго-ОРМ фильтр (или и различны)

Не DRY

Но это не DRY. Это не СУХОЙ, потому что мне нужно дважды закодировать материал. Один раз в has_object_permission() и один раз в фильтре django-orm.

Вопрос

Как решить мою потребность (QuerySet всех объектов пользователь может редактировать) без дублирования проверяя разрешения?

ответ

2

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

Я сомневаюсь, что это то, чего вы действительно хотите. Иногда вы не можете держать вещи СУХОЙ.

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

+0

Хотя это не тот ответ, который я искал: Спасибо, что подумали об этом. – guettli

+1

Да, это то, что меня беспокоит, и это не подходит для рамки Django REST. Я с нетерпением жду, есть ли у кого-нибудь другой вариант. – Linovia