summaryrefslogtreecommitdiff
path: root/tests/defer
diff options
context:
space:
mode:
authorGiannis Terzopoulos <terzo.giannis@gmail.com>2024-02-09 23:47:06 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2024-03-08 11:09:54 +0100
commit73df8b54a2fab53bec4c7573cda5ad8c869c2fd8 (patch)
tree3bd289c85fb2d99a3f534322ef38f94ca4e33bac /tests/defer
parent74f7fe3f3dd9725e92aa079c5f54b65d66db28de (diff)
Fixed #35044 -- Avoided clearing reverse relations and private fields when accessing deferred fields.
Regression in a7b5ad8b19a08d7d57302ece74f6e26d2887fd9f for reverse relations and possibly in 123b1d3fcf79f091573c40be6da7113a6ef35b62 for private fields.
Diffstat (limited to 'tests/defer')
-rw-r--r--tests/defer/models.py8
-rw-r--r--tests/defer/tests.py26
2 files changed, 34 insertions, 0 deletions
diff --git a/tests/defer/models.py b/tests/defer/models.py
index 6de2e2af97..560e54c8c0 100644
--- a/tests/defer/models.py
+++ b/tests/defer/models.py
@@ -19,6 +19,14 @@ class Primary(models.Model):
return self.name
+class PrimaryOneToOne(models.Model):
+ name = models.CharField(max_length=50)
+ value = models.CharField(max_length=50)
+ related = models.OneToOneField(
+ Secondary, models.CASCADE, related_name="primary_o2o"
+ )
+
+
class Child(Primary):
pass
diff --git a/tests/defer/tests.py b/tests/defer/tests.py
index c7eb03dc8a..3945b667ba 100644
--- a/tests/defer/tests.py
+++ b/tests/defer/tests.py
@@ -6,6 +6,7 @@ from .models import (
Child,
ChildProxy,
Primary,
+ PrimaryOneToOne,
RefreshPrimaryProxy,
Secondary,
ShadowChild,
@@ -326,3 +327,28 @@ class InvalidDeferTests(SimpleTestCase):
)
with self.assertRaisesMessage(FieldError, msg):
Primary.objects.only("name").select_related("related")[0]
+
+
+class DeferredRelationTests(TestCase):
+ @classmethod
+ def setUpTestData(cls):
+ cls.secondary = Secondary.objects.create(first="a", second="b")
+ cls.primary = PrimaryOneToOne.objects.create(
+ name="Bella", value="Baxter", related=cls.secondary
+ )
+
+ def test_defer_not_clear_cached_relations(self):
+ obj = Secondary.objects.defer("first").get(pk=self.secondary.pk)
+ with self.assertNumQueries(1):
+ obj.primary_o2o
+ obj.first # Accessing a deferred field.
+ with self.assertNumQueries(0):
+ obj.primary_o2o
+
+ def test_only_not_clear_cached_relations(self):
+ obj = Secondary.objects.only("first").get(pk=self.secondary.pk)
+ with self.assertNumQueries(1):
+ obj.primary_o2o
+ obj.second # Accessing a deferred field.
+ with self.assertNumQueries(0):
+ obj.primary_o2o