summaryrefslogtreecommitdiff
path: root/tests/regressiontests
diff options
context:
space:
mode:
authorTai Lee <tai.lee@3030.com.au>2012-11-28 18:16:00 +0200
committerAnssi Kääriäinen <akaariai@gmail.com>2012-11-28 18:25:34 +0200
commita21e8dee7682abdba646c5b72b6371d392e44dd1 (patch)
tree22006706ea1a5edd53d11d888cd1a51b9db2c102 /tests/regressiontests
parent54ce0ff7ba2afbac6d0a18e282b336e0ddb8c3a6 (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.py4
-rw-r--r--tests/regressiontests/defer_regress/tests.py31
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)