We have following two permission methods on BasePermission class:
def has_permission(self, request, view)def has_object_permission(self, request, view, obj)
Those two different methods are called for restricting unauthorized users for data insertion and manipulation.
has_permission is called on all HTTP requests whereas, has_object_permission is called from DRF’s method def get_object(self). Hence, has_object_permission method is available for GET, PUT, DELETE, not for POST request.
In summary:
permission_classesare looped over the defined list.has_object_permissionmethod is called afterhas_permissionmethod returns valueTrueexcept in POST method (inPOSTmethod onlyhas_permissionis executed).- When a
Falsevalue is returned from thepermission_classesmethod, the request gets no permission and will not loop more, otherwise, it checks all permissions on looping. has_permissionmethod will be called on all (GET,POST,PUT,DELETE)HTTPrequest.has_object_permissionmethod will not be called onHTTP POSTrequest, hence we need to restrict it fromhas_permissionmethod.