Вы получаете ошибку, потому что нет такого абстрактного понятия как владелец для всех моделей.Вам нужно будет определить отношения между объектом и пользователем в модели и применить их в разрешении для каждой модели.
В этом случае вы хотите быть уверены, что пользователь пытается изменить свое собственноепользовательский объект, так что вы можете просто сделать это:
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj == request.user
Таким образом, по сути, это будет работать только для модели User, и вам придется расширить его для работы с другими моделями, основываясь на отношениях модели сПользователь.
Возможно, вы захотите определить разные классы разрешений для каждого ресурса, чем пытаться поместить всю логику в один и тот же класс разрешений.
Что касается вашего вопроса о расширении пользовательской модели.Эта страница в документации объясняет различные методы расширения существующей пользовательской модели, которая в основном либо расширяется от AbstractUser
или AbstractbaseUser
.Структура разрешений Django будет по-прежнему работать, поскольку она реализована для этих базовых классов.
Однако имейте в виду, что классы разрешений DRF отличаются от разрешений Django.Вы можете использовать разрешения Django для реализации логики внутри классов разрешений, но они могут быть реализованы без разрешений.
РЕДАКТИРОВАТЬ ИЗ КОММЕНТАРИИ
Если у вас есть модель Ride
с владельцем, вы можете сделать это, чтобы объединить их.
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
if isinstance(obj, Ride):
return obj.owner == request.user
return obj == request.user