Index: views/debug.py
===================================================================
--- views/debug.py	(revision 7520)
+++ views/debug.py	(working copy)
@@ -474,7 +474,7 @@
                 {% for var in frame.vars|dictsort:"0" %}
                   <tr>
                     <td>{{ var.0|escape }}</td>
-                    <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+                    <td class="code"><div>{{ var.1|safe_pprint|escape }}</div></td>
                   </tr>
                 {% endfor %}
               </tbody>
Index: template/defaultfilters.py
===================================================================
--- template/defaultfilters.py	(revision 7520)
+++ template/defaultfilters.py	(working copy)
@@ -793,6 +793,24 @@
         return u"Error in formatting: %s" % force_unicode(e, errors="replace")
 pprint.is_safe = True
 
+from pprint import PrettyPrinter
+class SafePrettyPrinter(PrettyPrinter):
+    '''A PrettyPrinter that will never evaluate an unevaluated QuerySet.'''
+    def format(self, object, *a, **kw):
+        from django.db.models.query import QuerySet
+        if isinstance(object, QuerySet):
+            object = object.query.as_sql()
+        return PrettyPrinter.format(self, object, *a, **kw)
+
+def safe_pprint(value):
+    """A wrapper around pprint that ensures that QuerySets don't get evaluated.
+    If the QuerySet results have already been used, they will be cached and the
+    result will be identical to normal pprint. However, if the QuerySet has not
+    been used, this filter will return the SQL that the QuerySet would execute."""
+    pp = SafePrettyPrinter()
+    return pp.pformat(value)
+    
+
 # Syntax: register.filter(name of filter, callback)
 register.filter(add)
 register.filter(addslashes)
@@ -831,6 +849,7 @@
 register.filter(random)
 register.filter(rjust)
 register.filter(safe)
+register.filter(safe_pprint)
 register.filter('slice', slice_)
 register.filter(slugify)
 register.filter(stringformat)
