[1.8.x] Reverted "Fixed #6785 -- Made QuerySet.get() fetch a limited number of rows."

This reverts commit da79ccca1d.

This optimized the unsuccessful case at the expense of the successful one.

Backport of 293fd5da5b from master
This commit is contained in:
Tim Graham 2015-01-30 11:23:20 -05:00
parent 3d3c7a62c8
commit 7060ef7158
2 changed files with 5 additions and 37 deletions

View File

@ -23,10 +23,6 @@ from django.utils import six
from django.utils import timezone from django.utils import timezone
from django.utils.version import get_version from django.utils.version import get_version
# The maximum number (one less than the max to be precise) of results to fetch
# in a get() query
MAX_GET_RESULTS = 20
# The maximum number of items to display in a QuerySet.__repr__ # The maximum number of items to display in a QuerySet.__repr__
REPR_OUTPUT_SIZE = 20 REPR_OUTPUT_SIZE = 20
@ -326,21 +322,17 @@ class QuerySet(object):
clone = self.filter(*args, **kwargs) clone = self.filter(*args, **kwargs)
if self.query.can_filter(): if self.query.can_filter():
clone = clone.order_by() clone = clone.order_by()
if (not clone.query.select_for_update or
connections[self.db].features.supports_select_for_update_with_limit):
clone = clone[:MAX_GET_RESULTS + 1]
num = len(clone) num = len(clone)
if num == 1: if num == 1:
return clone._result_cache[0] return clone._result_cache[0]
if not num: if not num:
raise self.model.DoesNotExist( raise self.model.DoesNotExist(
"%s matching query does not exist." % "%s matching query does not exist." %
self.model._meta.object_name) self.model._meta.object_name
raise self.model.MultipleObjectsReturned(
"get() returned more than one %s -- it returned %s!" % (
self.model._meta.object_name,
num if num <= MAX_GET_RESULTS else 'more than %s' % MAX_GET_RESULTS
) )
raise self.model.MultipleObjectsReturned(
"get() returned more than one %s -- it returned %s!" %
(self.model._meta.object_name, num)
) )
def create(self, **kwargs): def create(self, **kwargs):

View File

@ -10,7 +10,7 @@ from django.db import DatabaseError
from django.db.models.fields import Field from django.db.models.fields import Field
from django.db.models.fields.related import ForeignObjectRel from django.db.models.fields.related import ForeignObjectRel
from django.db.models.manager import BaseManager from django.db.models.manager import BaseManager
from django.db.models.query import QuerySet, EmptyQuerySet, ValuesListQuerySet, MAX_GET_RESULTS from django.db.models.query import QuerySet, EmptyQuerySet, ValuesListQuerySet
from django.test import TestCase, TransactionTestCase, skipIfDBFeature, skipUnlessDBFeature from django.test import TestCase, TransactionTestCase, skipIfDBFeature, skipUnlessDBFeature
from django.utils import six from django.utils import six
from django.utils.translation import ugettext_lazy from django.utils.translation import ugettext_lazy
@ -178,30 +178,6 @@ class ModelTest(TestCase):
self.assertNotEqual(Article.objects.get(id__exact=a1.id), Article.objects.get(id__exact=a2.id)) self.assertNotEqual(Article.objects.get(id__exact=a1.id), Article.objects.get(id__exact=a2.id))
def test_multiple_objects_max_num_fetched(self):
"""
#6785 - get() should fetch a limited number of results.
"""
Article.objects.bulk_create(
Article(headline='Area %s' % i, pub_date=datetime(2005, 7, 28))
for i in range(MAX_GET_RESULTS)
)
six.assertRaisesRegex(
self,
MultipleObjectsReturned,
"get\(\) returned more than one Article -- it returned %d!" % MAX_GET_RESULTS,
Article.objects.get,
headline__startswith='Area',
)
Article.objects.create(headline='Area %s' % MAX_GET_RESULTS, pub_date=datetime(2005, 7, 28))
six.assertRaisesRegex(
self,
MultipleObjectsReturned,
"get\(\) returned more than one Article -- it returned more than %d!" % MAX_GET_RESULTS,
Article.objects.get,
headline__startswith='Area',
)
@skipUnlessDBFeature('supports_microsecond_precision') @skipUnlessDBFeature('supports_microsecond_precision')
def test_microsecond_precision(self): def test_microsecond_precision(self):
# In PostgreSQL, microsecond-level precision is available. # In PostgreSQL, microsecond-level precision is available.