summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2022-08-18 12:30:20 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-08-30 08:43:53 +0200
commitb3db6c8dcb5145f7d45eff517bcd96460475c879 (patch)
treeca51349fab4db9de0f86dcb315c24caa02ae1e2a /tests
parent5d12650ed9269acb3cba97fd70e8df2e35a55a54 (diff)
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.
Diffstat (limited to 'tests')
-rw-r--r--tests/defer/tests.py4
-rw-r--r--tests/defer_regress/tests.py24
-rw-r--r--tests/queries/tests.py6
3 files changed, 26 insertions, 8 deletions
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):