summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-10-08 08:38:33 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-10-08 08:38:33 +0000
commit44f228fd61e5f45dbdfa465291319dfd5dd66393 (patch)
tree011d815e54bd9268b4af22a415175a507de65ec2
parent268ef594ace36e82043b2f9b6eaa18531cd24b2f (diff)
Fixed #6748 -- When printing the repr() of querysets, don't load or display
more than 20 objects. This means that accidentally executing HugeStoryArchive.objects.all() at the interactive prompt (or in the debug template) won't try to load all 4,233,010 stories into memory and print them out. That would previously cause resource starvation and other "interesting" crashes. If you really, really want the previous behaviour (e.g. in a doctest that prints more than 20 items), display "list(qs)" instead of just "qs". git-svn-id: http://code.djangoproject.com/svn/django/trunk@9202 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/query.py8
-rw-r--r--tests/regressiontests/queries/models.py2
2 files changed, 8 insertions, 2 deletions
diff --git a/django/db/models/query.py b/django/db/models/query.py
index b08f3acd14..5b9f504d2f 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -15,6 +15,9 @@ from django.utils.datastructures import SortedDict
CHUNK_SIZE = 100
ITER_CHUNK_SIZE = CHUNK_SIZE
+# The maximum number of items to display in a QuerySet.__repr__
+REPR_OUTPUT_SIZE = 20
+
# Pull into this namespace for backwards compatibility.
EmptyResultSet = sql.EmptyResultSet
@@ -141,7 +144,10 @@ class QuerySet(object):
return obj_dict
def __repr__(self):
- return repr(list(self))
+ data = list(self[:REPR_OUTPUT_SIZE + 1])
+ if len(data) > REPR_OUTPUT_SIZE:
+ data[-1] = "...(remaining elements truncated)..."
+ return repr(data)
def __len__(self):
# Since __len__ is called quite frequently (for example, as part of
diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py
index e5d17c0aaf..12822c6f7a 100644
--- a/tests/regressiontests/queries/models.py
+++ b/tests/regressiontests/queries/models.py
@@ -556,7 +556,7 @@ Bug #2076
# automatically. Item normally requires a join with Note to do the default
# ordering, but that isn't needed here.
>>> qs = Item.objects.order_by('name')
->>> qs
+>>> list(qs)
[<Item: four>, <Item: one>, <Item: three>, <Item: two>]
>>> len(qs.query.tables)
1