2015-12-04 3 views
2

Почему django rest framework проверяет права объекта при создании объекта? Нет никакого смысла (для меня, во всяком случае), что пользователь должен иметь возможность создавать объект, который они не могли видеть, обновлять или удалять. В настоящее время я подклассифицирую вид, подобныйDjango Rest Framework Permission Check On Создать

class CheckCreatePermissionsViewSet(ModelViewSet): 
    def perform_create(self, serializer): 
    ''' 
    Called by create before calling serializer.save() 
    ''' 
    obj = serializer.save() 
    try: 
     self.check_object_permissions(obj) 
    except: 
     obj.delete() 
     raise 

Почему это не реализовано по умолчанию? Это вызвало у меня головную боль, и я не могу придумать ни одной причины, чтобы это было реализовано так.

ответ

0

Если вы намерены не создавать объект, если у пользователя нет определенного разрешения, вы можете использовать allow_classes внутри Viewset, чтобы viewet даже не позволял пользователю создавать объект.

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

например, вы хотите, чтобы только администратор создавал объект, вы можете добавить permission_classes=[permissions.IsAdminUser] к просмотру, чтобы элемент управления даже не попал внутрь perform_create. Viewset отправит 403, если обычный пользователь попытается создать объект. Надеюсь, это то, что вы хотели.

0

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

class CheckCreatePermissionsViewSet(ModelViewSet): 
    def perform_create(self, serializer): 
     try: 
      business_rules_are_ok(serializer.data, user): 
     except BusinessException: 
      raise ValidationError(<content from BusinessException) 
     serializer.save() 
+0

Если вы думаете, вы должны использовать 'serializer.validated_data', а не' serializer.data' – luc