summaryrefslogtreecommitdiff
path: root/tests/queryset_pickle
diff options
context:
space:
mode:
authorAndrew Brown <brownan@gmail.com>2019-08-27 12:58:11 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-08-27 13:05:20 +0200
commit691def10a0197d83d2d108bd9043b0916d0f09b4 (patch)
tree44d4c239fc2d887b9cd58eb9b8fccba09ed76171 /tests/queryset_pickle
parent03dbdfd9bbbbd0b0172aad648c6bbe3f39541137 (diff)
Fixed #30727 -- Made Subquery pickle without evaluating their QuerySet.
Subquery expression objects, when pickled, were evaluating the QuerySet objects saved in its _constructor_args attribute.
Diffstat (limited to 'tests/queryset_pickle')
-rw-r--r--tests/queryset_pickle/tests.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/queryset_pickle/tests.py b/tests/queryset_pickle/tests.py
index e5cee5fd66..1b3f237819 100644
--- a/tests/queryset_pickle/tests.py
+++ b/tests/queryset_pickle/tests.py
@@ -172,6 +172,41 @@ class PickleabilityTestCase(TestCase):
m2ms = pickle.loads(pickle.dumps(m2ms))
self.assertSequenceEqual(m2ms, [m2m])
+ def test_pickle_exists_queryset_still_usable(self):
+ group = Group.objects.create(name='group')
+ Event.objects.create(title='event', group=group)
+ groups = Group.objects.annotate(
+ has_event=models.Exists(
+ Event.objects.filter(group_id=models.OuterRef('id')),
+ ),
+ )
+ groups2 = pickle.loads(pickle.dumps(groups))
+ self.assertSequenceEqual(groups2.filter(has_event=True), [group])
+
+ def test_pickle_exists_queryset_not_evaluated(self):
+ group = Group.objects.create(name='group')
+ Event.objects.create(title='event', group=group)
+ groups = Group.objects.annotate(
+ has_event=models.Exists(
+ Event.objects.filter(group_id=models.OuterRef('id')),
+ ),
+ )
+ list(groups) # evaluate QuerySet.
+ with self.assertNumQueries(0):
+ self.assert_pickles(groups)
+
+ def test_pickle_subquery_queryset_not_evaluated(self):
+ group = Group.objects.create(name='group')
+ Event.objects.create(title='event', group=group)
+ groups = Group.objects.annotate(
+ event_title=models.Subquery(
+ Event.objects.filter(group_id=models.OuterRef('id')).values('title'),
+ ),
+ )
+ list(groups) # evaluate QuerySet.
+ with self.assertNumQueries(0):
+ self.assert_pickles(groups)
+
def test_annotation_with_callable_default(self):
# Happening.when has a callable default of datetime.datetime.now.
qs = Happening.objects.annotate(latest_time=models.Max('when'))