mirror of
https://github.com/django/django.git
synced 2025-10-28 08:06:09 +00:00
[1.5.x] Fixed #14694 -- Made `defer()` work with reverse relations
Reverse o2o fields are now usable with defer.
Backpatch of [6ebf115206]
This commit is contained in:
committed by
Anssi Kääriäinen
parent
54ce0ff7ba
commit
a21e8dee76
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user