diff --git a/django/db/models/query.py b/django/db/models/query.py
index 0f1d87c..526bc94 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -42,6 +42,7 @@ class QuerySet(object):
         self._prefetch_related_lookups = []
         self._prefetch_done = False
         self._known_related_object = None       # (attname, rel_obj)
+        self._gimme_called = False
 
     ########################
     # PYTHON MAGIC METHODS #
@@ -541,7 +542,10 @@ class QuerySet(object):
         else:
             forced_managed = False
         try:
-            rows = query.get_compiler(self.db).execute_sql(None)
+            if self._gimme_called:
+                ret = query.get_compiler(self.db)
+            else:
+                ret = query.get_compiler(self.db).execute_sql(None)
             if forced_managed:
                 transaction.commit(using=self.db)
             else:
@@ -550,7 +554,7 @@ class QuerySet(object):
             if forced_managed:
                 transaction.leave_transaction_management(using=self.db)
         self._result_cache = None
-        return rows
+        return ret
     update.alters_data = True
 
     def _update(self, values):
@@ -932,6 +936,18 @@ class QuerySet(object):
             return obj.query.get_compiler(connection=connection).as_nested_sql()
         raise ValueError("Can't do subqueries with queries on different DBs.")
 
+    def _gimme_qs(self):
+        """
+        Calling this debug-helper method will give a queryset instead of
+        executing the query when calling a terminal queries. Usage example:
+            qs = qs._gimme_qs().update(foo='bar')
+            assertTrue('footable' in qs.query.alias_map)
+
+        The terminal method must be called directly after _gimme_qs().
+        """
+        self._gimme_called = True
+        return self
+
     # When used as part of a nested query, a queryset will never be an "always
     # empty" result.
     value_annotation = True
diff --git a/tests/modeltests/update/tests.py b/tests/modeltests/update/tests.py
index 7a1177c..4b9da1f 100644
--- a/tests/modeltests/update/tests.py
+++ b/tests/modeltests/update/tests.py
@@ -1,5 +1,6 @@
 from __future__ import absolute_import, unicode_literals
 
+from django.db.models import Count
 from django.test import TestCase
 
 from .models import A, B, C, D, DataPoint, RelatedPoint
@@ -116,3 +117,7 @@ class AdvancedTests(TestCase):
         method = DataPoint.objects.all()[:2].update
         self.assertRaises(AssertionError, method,
             another_value='another thing')
+
+    def test_update_annotate(self):
+        qs = DataPoint.objects.annotate(Count('relatedpoint__name'))._gimme_qs().update(value='foo')
+        print qs.query
