From b3db6c8dcb5145f7d45eff517bcd96460475c879 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Thu, 18 Aug 2022 12:30:20 -0400 Subject: Fixed #21204 -- Tracked field deferrals by field instead of models. This ensures field deferral works properly when a model is involved more than once in the same query with a distinct deferral mask. --- tests/defer/tests.py | 4 ++++ tests/defer_regress/tests.py | 24 ++++++++++++++++++++++-- tests/queries/tests.py | 6 ------ 3 files changed, 26 insertions(+), 8 deletions(-) (limited to 'tests') diff --git a/tests/defer/tests.py b/tests/defer/tests.py index fe9637c7f1..c2319b54ec 100644 --- a/tests/defer/tests.py +++ b/tests/defer/tests.py @@ -290,6 +290,8 @@ class InvalidDeferTests(SimpleTestCase): msg = "Primary has no field named 'missing'" with self.assertRaisesMessage(FieldDoesNotExist, msg): list(Primary.objects.defer("missing")) + with self.assertRaisesMessage(FieldError, "missing"): + list(Primary.objects.defer("value__missing")) msg = "Secondary has no field named 'missing'" with self.assertRaisesMessage(FieldDoesNotExist, msg): list(Primary.objects.defer("related__missing")) @@ -298,6 +300,8 @@ class InvalidDeferTests(SimpleTestCase): msg = "Primary has no field named 'missing'" with self.assertRaisesMessage(FieldDoesNotExist, msg): list(Primary.objects.only("missing")) + with self.assertRaisesMessage(FieldError, "missing"): + list(Primary.objects.only("value__missing")) msg = "Secondary has no field named 'missing'" with self.assertRaisesMessage(FieldDoesNotExist, msg): list(Primary.objects.only("related__missing")) diff --git a/tests/defer_regress/tests.py b/tests/defer_regress/tests.py index c7a61f53a3..fb9dcdb297 100644 --- a/tests/defer_regress/tests.py +++ b/tests/defer_regress/tests.py @@ -246,8 +246,6 @@ class DeferRegressionTest(TestCase): ) self.assertEqual(len(qs), 1) - -class DeferAnnotateSelectRelatedTest(TestCase): def test_defer_annotate_select_related(self): location = Location.objects.create() Request.objects.create(location=location) @@ -276,6 +274,28 @@ class DeferAnnotateSelectRelatedTest(TestCase): list, ) + def test_common_model_different_mask(self): + child = Child.objects.create(name="Child", value=42) + second_child = Child.objects.create(name="Second", value=64) + Leaf.objects.create(child=child, second_child=second_child) + with self.assertNumQueries(1): + leaf = ( + Leaf.objects.select_related("child", "second_child") + .defer("child__name", "second_child__value") + .get() + ) + self.assertEqual(leaf.child, child) + self.assertEqual(leaf.second_child, second_child) + self.assertEqual(leaf.child.get_deferred_fields(), {"name"}) + self.assertEqual(leaf.second_child.get_deferred_fields(), {"value"}) + with self.assertNumQueries(0): + self.assertEqual(leaf.child.value, 42) + self.assertEqual(leaf.second_child.name, "Second") + with self.assertNumQueries(1): + self.assertEqual(leaf.child.name, "Child") + with self.assertNumQueries(1): + self.assertEqual(leaf.second_child.value, 64) + class DeferDeletionSignalsTests(TestCase): senders = [Item, Proxy] diff --git a/tests/queries/tests.py b/tests/queries/tests.py index 1238f021be..1bd72dd8b8 100644 --- a/tests/queries/tests.py +++ b/tests/queries/tests.py @@ -3594,12 +3594,6 @@ class WhereNodeTest(SimpleTestCase): class QuerySetExceptionTests(SimpleTestCase): - def test_iter_exceptions(self): - qs = ExtraInfo.objects.only("author") - msg = "'ManyToOneRel' object has no attribute 'attname'" - with self.assertRaisesMessage(AttributeError, msg): - list(qs) - def test_invalid_order_by(self): msg = "Cannot resolve keyword '*' into field. Choices are: created, id, name" with self.assertRaisesMessage(FieldError, msg): -- cgit v1.3