Commit 0eddedf7 authored by Anssi Kääriäinen's avatar Anssi Kääriäinen
Browse files

[1.5.x] Fixed #20278 -- ensured .get() exceptions do not recurse infinitely

A regression caused by d5b93d32 made .get() error
reporting recurse infinitely on certain rare conditions. Fixed this by
not trying to print the given lookup kwargs.

Backpatch of 266c0bb2
parent 367089a8
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -384,13 +384,11 @@ class QuerySet(object):
            return clone._result_cache[0]
        if not num:
            raise self.model.DoesNotExist(
                "%s matching query does not exist. "
                "Lookup parameters were %s" %
                (self.model._meta.object_name, kwargs))
                "%s matching query does not exist." %
                self.model._meta.object_name)
        raise self.model.MultipleObjectsReturned(
            "get() returned more than one %s -- it returned %s! "
            "Lookup parameters were %s" %
            (self.model._meta.object_name, num, kwargs))
            "get() returned more than one %s -- it returned %s!" %
            (self.model._meta.object_name, num))

    def create(self, **kwargs):
        """
+8 −0
Original line number Diff line number Diff line
@@ -18,3 +18,11 @@ class Article(models.Model):

    def __str__(self):
        return self.headline

@python_2_unicode_compatible
class SelfRef(models.Model):
    selfref = models.ForeignKey('self', null=True, blank=True,
                                related_name='+')

    def __str__(self):
        return SelfRef.objects.get(selfref=self).pk
+9 −14
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature
from django.utils import six
from django.utils.translation import ugettext_lazy

from .models import Article
from .models import Article, SelfRef


class ModelTest(TestCase):
@@ -84,23 +84,14 @@ class ModelTest(TestCase):
        # parameters don't match any object.
        six.assertRaisesRegex(self,
            ObjectDoesNotExist,
            "Article matching query does not exist. Lookup parameters were "
            "{'id__exact': 2000}",
            "Article matching query does not exist.",
            Article.objects.get,
            id__exact=2000,
        )
        # To avoid dict-ordering related errors check only one lookup
        # in single assert.
        six.assertRaisesRegex(self,
            ObjectDoesNotExist,
            ".*'pub_date__year': 2005.*",
            Article.objects.get,
            pub_date__year=2005,
            pub_date__month=8,
        )
        six.assertRaisesRegex(self,
        self.assertRaises(
            ObjectDoesNotExist,
            ".*'pub_date__month': 8.*",
            Article.objects.get,
            pub_date__year=2005,
            pub_date__month=8,
@@ -108,8 +99,7 @@ class ModelTest(TestCase):

        six.assertRaisesRegex(self,
            ObjectDoesNotExist,
            "Article matching query does not exist. Lookup parameters were "
            "{'pub_date__week_day': 6}",
            "Article matching query does not exist.",
            Article.objects.get,
            pub_date__week_day=6,
        )
@@ -639,3 +629,8 @@ class ModelTest(TestCase):
        Article.objects.bulk_create([Article(headline=lazy, pub_date=datetime.now())])
        article = Article.objects.get()
        self.assertEqual(article.headline, notlazy)

    def test_ticket_20278(self):
        sr = SelfRef.objects.create()
        with self.assertRaises(ObjectDoesNotExist):
            SelfRef.objects.get(selfref=sr)