ptrvch
@ptrvch
вебдев-энтузиаст. Django, AngularJS

Как настроить permissions на создание дочернего объекта?

Две модели связаны следующим образом:
class ParentModel(models.Model):
    creator = models.ForeignKey(User, related_name='objects')
    name = models.CharField(max_length=40)

class ChildModel(models.Model):
    parent = models.ForeignKey(ParentModel, related_name='child_objects')
    name = models.CharField(max_length=40)


При формировании ViewSet для дочерней модели указываю в permission_classes:
class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.parent.creator == request.user


Методом тыка установлено, что этот класс (помимо SAFE_METHODS) отрабатывает правильно при методе PATCH, но при POST почему-то любой пользователь может создать дочерний объект с родителем, не принадлежащим этому пользователю.

В settings.py в настройках permissions есть только 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'

Ткните в доки, что я здесь упустил.
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 1
ptrvch
@ptrvch Автор вопроса
вебдев-энтузиаст. Django, AngularJS
на SO подсказали, что метод POST не работает с существующим объектом, поэтому нужно указывать логику в has_permission:

def has_permission(self, request, view):
    user_id = getattr(request.user, 'id')
    parent_id = request.data['parent']
    if parent_id is not None:
        parent_obj = ParentModel.objects.get(id=parent_id)
        serialized = ParentSerializer(parent_obj)
        return user_id == serialized.data['creator']
    return False
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы