The thing that is returned by connection.cursor() is (normally) a Django object of type CursorWrapper that itself has the "real" cursor as a property called cursor.
However, it could be a CursorDebugWrapper instead, or it could be an outer wrapper wrapping one of those. For example django-debug-toolbar wraps CursorDebugWrapper in a NormalCursorWrapper. The django-db-readonly package wraps the Django CursorWrapper in a ReadOnlyCursorWrapper. This is resolved in this update.
The thing that is returned by connection.cursor() is (normally) a Django object of type CursorWrapper that itself has the "real" cursor as a property called cursor. However, it could be a CursorDebugWrapper instead, or it could be an outer wrapper wrapping one of those. For example django-debug-toolbar wraps CursorDebugWrapper in a NormalCursorWrapper. The django-db-readonly package wraps the Django CursorWrapper in a ReadOnlyCursorWrapper. This is resolved in this update.