Fixed #26486 -- Fixed a select_related() + defer() MTI edge case.
This commit is contained in:
parent
c339a5a6f7
commit
0456a8b9e6
|
@ -256,7 +256,6 @@ def select_related_descend(field, restricted, requested, load_fields, reverse=Fa
|
||||||
" and traversed using select_related"
|
" and traversed using select_related"
|
||||||
" at the same time." %
|
" at the same time." %
|
||||||
(field.model._meta.object_name, field.name))
|
(field.model._meta.object_name, field.name))
|
||||||
return False
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -128,9 +128,8 @@ class DeferTests(AssertionMixin, TestCase):
|
||||||
Primary.objects.only("name").select_related("related")[0]
|
Primary.objects.only("name").select_related("related")[0]
|
||||||
|
|
||||||
def test_defer_foreign_keys_are_deferred_and_not_traversed(self):
|
def test_defer_foreign_keys_are_deferred_and_not_traversed(self):
|
||||||
# With a depth-based select_related, all deferred ForeignKeys are
|
# select_related() overrides defer().
|
||||||
# deferred instead of traversed.
|
with self.assertNumQueries(1):
|
||||||
with self.assertNumQueries(3):
|
|
||||||
obj = Primary.objects.defer("related").select_related()[0]
|
obj = Primary.objects.defer("related").select_related()[0]
|
||||||
self.assert_delayed(obj, 1)
|
self.assert_delayed(obj, 1)
|
||||||
self.assertEqual(obj.related.id, self.s1.pk)
|
self.assertEqual(obj.related.id, self.s1.pk)
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
from django.core.exceptions import FieldError
|
from django.core.exceptions import FieldError
|
||||||
from django.test import SimpleTestCase, TestCase
|
from django.test import SimpleTestCase, TestCase
|
||||||
|
|
||||||
|
@ -175,7 +173,6 @@ class ReverseSelectRelatedTestCase(TestCase):
|
||||||
self.assertEqual(p.child1.child4.value, p.child1.value)
|
self.assertEqual(p.child1.child4.value, p.child1.value)
|
||||||
self.assertEqual(p.child1.child4.value4, 4)
|
self.assertEqual(p.child1.child4.value4, 4)
|
||||||
|
|
||||||
@unittest.expectedFailure
|
|
||||||
def test_inheritance_deferred(self):
|
def test_inheritance_deferred(self):
|
||||||
c = Child4.objects.create(name1='n1', name2='n2', value=1, value4=4)
|
c = Child4.objects.create(name1='n1', name2='n2', value=1, value4=4)
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(1):
|
||||||
|
@ -192,10 +189,9 @@ class ReverseSelectRelatedTestCase(TestCase):
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(1):
|
||||||
self.assertEqual(p.child1.name2, 'n2')
|
self.assertEqual(p.child1.name2, 'n2')
|
||||||
|
|
||||||
@unittest.expectedFailure
|
|
||||||
def test_inheritance_deferred2(self):
|
def test_inheritance_deferred2(self):
|
||||||
c = Child4.objects.create(name1='n1', name2='n2', value=1, value4=4)
|
c = Child4.objects.create(name1='n1', name2='n2', value=1, value4=4)
|
||||||
qs = Parent2.objects.select_related('child1', 'child4').only(
|
qs = Parent2.objects.select_related('child1', 'child1__child4').only(
|
||||||
'id2', 'child1__value', 'child1__child4__value4')
|
'id2', 'child1__value', 'child1__child4__value4')
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(1):
|
||||||
p = qs.get(name2="n2")
|
p = qs.get(name2="n2")
|
||||||
|
@ -207,9 +203,8 @@ class ReverseSelectRelatedTestCase(TestCase):
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(1):
|
||||||
self.assertEqual(p.child1.name2, 'n2')
|
self.assertEqual(p.child1.name2, 'n2')
|
||||||
p = qs.get(name2="n2")
|
p = qs.get(name2="n2")
|
||||||
with self.assertNumQueries(1):
|
with self.assertNumQueries(0):
|
||||||
self.assertEqual(p.child1.name1, 'n1')
|
self.assertEqual(p.child1.name1, 'n1')
|
||||||
with self.assertNumQueries(1):
|
|
||||||
self.assertEqual(p.child1.child4.name1, 'n1')
|
self.assertEqual(p.child1.child4.name1, 'n1')
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue