summaryrefslogtreecommitdiff
path: root/tests/modeltests/defer/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/modeltests/defer/tests.py')
-rw-r--r--tests/modeltests/defer/tests.py20
1 files changed, 15 insertions, 5 deletions
diff --git a/tests/modeltests/defer/tests.py b/tests/modeltests/defer/tests.py
index eb09162b01..50db5a76b4 100644
--- a/tests/modeltests/defer/tests.py
+++ b/tests/modeltests/defer/tests.py
@@ -1,6 +1,6 @@
from __future__ import absolute_import
-from django.db.models.query_utils import DeferredAttribute
+from django.db.models.query_utils import DeferredAttribute, InvalidQuery
from django.test import TestCase
from .models import Secondary, Primary, Child, BigChild, ChildProxy
@@ -73,9 +73,19 @@ class DeferTests(TestCase):
self.assert_delayed(qs.defer("name").get(pk=p1.pk), 1)
self.assert_delayed(qs.only("name").get(pk=p1.pk), 2)
- # DOES THIS WORK?
- self.assert_delayed(qs.only("name").select_related("related")[0], 1)
- self.assert_delayed(qs.defer("related").select_related("related")[0], 0)
+ # When we defer a field and also select_related it, the query is
+ # invalid and raises an exception.
+ with self.assertRaises(InvalidQuery):
+ qs.only("name").select_related("related")[0]
+ with self.assertRaises(InvalidQuery):
+ qs.defer("related").select_related("related")[0]
+
+ # With a depth-based select_related, all deferred ForeignKeys are
+ # deferred instead of traversed.
+ with self.assertNumQueries(3):
+ obj = qs.defer("related").select_related()[0]
+ self.assert_delayed(obj, 1)
+ self.assertEqual(obj.related.id, s1.pk)
# Saving models with deferred fields is possible (but inefficient,
# since every field has to be retrieved first).
@@ -155,7 +165,7 @@ class DeferTests(TestCase):
children = ChildProxy.objects.all().select_related().only('id', 'name')
self.assertEqual(len(children), 1)
child = children[0]
- self.assert_delayed(child, 1)
+ self.assert_delayed(child, 2)
self.assertEqual(child.name, 'p1')
self.assertEqual(child.value, 'xx')