diff options
| author | Tai Lee <tai.lee@3030.com.au> | 2012-11-28 18:16:00 +0200 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2012-11-28 18:25:34 +0200 |
| commit | a21e8dee7682abdba646c5b72b6371d392e44dd1 (patch) | |
| tree | 22006706ea1a5edd53d11d888cd1a51b9db2c102 /tests/regressiontests | |
| parent | 54ce0ff7ba2afbac6d0a18e282b336e0ddb8c3a6 (diff) | |
[1.5.x] Fixed #14694 -- Made ``defer()`` work with reverse relations
Reverse o2o fields are now usable with defer.
Backpatch of [6ebf115206289bce8f3d86318871faac13d6e835]
Diffstat (limited to 'tests/regressiontests')
| -rw-r--r-- | tests/regressiontests/defer_regress/models.py | 4 | ||||
| -rw-r--r-- | tests/regressiontests/defer_regress/tests.py | 31 |
2 files changed, 34 insertions, 1 deletions
diff --git a/tests/regressiontests/defer_regress/models.py b/tests/regressiontests/defer_regress/models.py index 444649ac92..7528e3b2c9 100644 --- a/tests/regressiontests/defer_regress/models.py +++ b/tests/regressiontests/defer_regress/models.py @@ -55,6 +55,10 @@ class Feature(models.Model): class SpecialFeature(models.Model): feature = models.ForeignKey(Feature) +class OneToOneItem(models.Model): + item = models.OneToOneField(Item, related_name="one_to_one_item") + name = models.CharField(max_length=15) + class ItemAndSimpleItem(models.Model): item = models.ForeignKey(Item) simple = models.ForeignKey(SimpleItem) diff --git a/tests/regressiontests/defer_regress/tests.py b/tests/regressiontests/defer_regress/tests.py index c77ca32135..964e4dc7c7 100644 --- a/tests/regressiontests/defer_regress/tests.py +++ b/tests/regressiontests/defer_regress/tests.py @@ -9,7 +9,7 @@ from django.db.models.loading import cache from django.test import TestCase from .models import (ResolveThis, Item, RelatedItem, Child, Leaf, Proxy, - SimpleItem, Feature, ItemAndSimpleItem, SpecialFeature) + SimpleItem, Feature, ItemAndSimpleItem, OneToOneItem, SpecialFeature) class DeferRegressionTest(TestCase): @@ -111,6 +111,7 @@ class DeferRegressionTest(TestCase): Item, ItemAndSimpleItem, Leaf, + OneToOneItem, Proxy, RelatedItem, ResolveThis, @@ -147,6 +148,7 @@ class DeferRegressionTest(TestCase): "Leaf_Deferred_name_value", "Leaf_Deferred_second_child_id_value", "Leaf_Deferred_value", + "OneToOneItem", "Proxy", "RelatedItem", "RelatedItem_Deferred_", @@ -182,6 +184,33 @@ class DeferRegressionTest(TestCase): self.assertEqual(1, qs.count()) self.assertEqual('Foobar', qs[0].name) + def test_reverse_one_to_one_relations(self): + # Refs #14694. Test reverse relations which are known unique (reverse + # side has o2ofield or unique FK) - the o2o case + item = Item.objects.create(name="first", value=42) + o2o = OneToOneItem.objects.create(item=item, name="second") + self.assertEqual(len(Item.objects.defer('one_to_one_item__name')), 1) + self.assertEqual(len(Item.objects.select_related('one_to_one_item')), 1) + self.assertEqual(len(Item.objects.select_related( + 'one_to_one_item').defer('one_to_one_item__name')), 1) + self.assertEqual(len(Item.objects.select_related('one_to_one_item').defer('value')), 1) + # Make sure that `only()` doesn't break when we pass in a unique relation, + # rather than a field on the relation. + self.assertEqual(len(Item.objects.only('one_to_one_item')), 1) + with self.assertNumQueries(1): + i = Item.objects.select_related('one_to_one_item')[0] + self.assertEquals(i.one_to_one_item.pk, o2o.pk) + self.assertEquals(i.one_to_one_item.name, "second") + with self.assertNumQueries(1): + i = Item.objects.select_related('one_to_one_item').defer( + 'value', 'one_to_one_item__name')[0] + self.assertEquals(i.one_to_one_item.pk, o2o.pk) + self.assertEquals(i.name, "first") + with self.assertNumQueries(1): + self.assertEquals(i.one_to_one_item.name, "second") + with self.assertNumQueries(1): + self.assertEquals(i.value, 42) + def test_defer_with_select_related(self): item1 = Item.objects.create(name="first", value=47) item2 = Item.objects.create(name="second", value=42) |
