mirror of
https://github.com/django/django.git
synced 2025-10-30 00:56:09 +00:00
Fixed #21204 -- Tracked field deferrals by field instead of models.
This ensures field deferral works properly when a model is involved more than once in the same query with a distinct deferral mask.
This commit is contained in:
committed by
Mariusz Felisiak
parent
5d12650ed9
commit
b3db6c8dcb
@@ -246,8 +246,6 @@ class DeferRegressionTest(TestCase):
|
||||
)
|
||||
self.assertEqual(len(qs), 1)
|
||||
|
||||
|
||||
class DeferAnnotateSelectRelatedTest(TestCase):
|
||||
def test_defer_annotate_select_related(self):
|
||||
location = Location.objects.create()
|
||||
Request.objects.create(location=location)
|
||||
@@ -276,6 +274,28 @@ class DeferAnnotateSelectRelatedTest(TestCase):
|
||||
list,
|
||||
)
|
||||
|
||||
def test_common_model_different_mask(self):
|
||||
child = Child.objects.create(name="Child", value=42)
|
||||
second_child = Child.objects.create(name="Second", value=64)
|
||||
Leaf.objects.create(child=child, second_child=second_child)
|
||||
with self.assertNumQueries(1):
|
||||
leaf = (
|
||||
Leaf.objects.select_related("child", "second_child")
|
||||
.defer("child__name", "second_child__value")
|
||||
.get()
|
||||
)
|
||||
self.assertEqual(leaf.child, child)
|
||||
self.assertEqual(leaf.second_child, second_child)
|
||||
self.assertEqual(leaf.child.get_deferred_fields(), {"name"})
|
||||
self.assertEqual(leaf.second_child.get_deferred_fields(), {"value"})
|
||||
with self.assertNumQueries(0):
|
||||
self.assertEqual(leaf.child.value, 42)
|
||||
self.assertEqual(leaf.second_child.name, "Second")
|
||||
with self.assertNumQueries(1):
|
||||
self.assertEqual(leaf.child.name, "Child")
|
||||
with self.assertNumQueries(1):
|
||||
self.assertEqual(leaf.second_child.value, 64)
|
||||
|
||||
|
||||
class DeferDeletionSignalsTests(TestCase):
|
||||
senders = [Item, Proxy]
|
||||
|
||||
Reference in New Issue
Block a user