diff options
| author | Giannis Terzopoulos <terzo.giannis@gmail.com> | 2024-02-09 23:47:06 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2024-03-08 11:09:54 +0100 |
| commit | 73df8b54a2fab53bec4c7573cda5ad8c869c2fd8 (patch) | |
| tree | 3bd289c85fb2d99a3f534322ef38f94ca4e33bac /tests/defer | |
| parent | 74f7fe3f3dd9725e92aa079c5f54b65d66db28de (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.py | 8 | ||||
| -rw-r--r-- | tests/defer/tests.py | 26 |
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 |
