diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/defer_regress/models.py | 6 | ||||
| -rw-r--r-- | tests/defer_regress/tests.py | 21 |
2 files changed, 27 insertions, 0 deletions
diff --git a/tests/defer_regress/models.py b/tests/defer_regress/models.py index dd492993b7..38ba4a622f 100644 --- a/tests/defer_regress/models.py +++ b/tests/defer_regress/models.py @@ -10,6 +10,12 @@ class Item(models.Model): text = models.TextField(default="xyzzy") value = models.IntegerField() other_value = models.IntegerField(default=0) + source = models.OneToOneField( + "self", + related_name="destination", + on_delete=models.CASCADE, + null=True, + ) class RelatedItem(models.Model): diff --git a/tests/defer_regress/tests.py b/tests/defer_regress/tests.py index 10100e348d..1209325f21 100644 --- a/tests/defer_regress/tests.py +++ b/tests/defer_regress/tests.py @@ -309,6 +309,27 @@ class DeferRegressionTest(TestCase): with self.assertNumQueries(1): self.assertEqual(Item.objects.only("request").get(), item) + def test_self_referential_one_to_one(self): + first = Item.objects.create(name="first", value=1) + second = Item.objects.create(name="second", value=2, source=first) + with self.assertNumQueries(1): + deferred_first, deferred_second = ( + Item.objects.select_related("source", "destination") + .only("name", "source__name", "destination__value") + .order_by("pk") + ) + with self.assertNumQueries(0): + self.assertEqual(deferred_first.name, first.name) + self.assertEqual(deferred_second.name, second.name) + self.assertEqual(deferred_second.source.name, first.name) + self.assertEqual(deferred_first.destination.value, second.value) + with self.assertNumQueries(1): + self.assertEqual(deferred_first.value, first.value) + with self.assertNumQueries(1): + self.assertEqual(deferred_second.source.value, first.value) + with self.assertNumQueries(1): + self.assertEqual(deferred_first.destination.name, second.name) + class DeferDeletionSignalsTests(TestCase): senders = [Item, Proxy] |
