diff options
| author | Andrew Brown <brownan@gmail.com> | 2019-08-27 12:58:11 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-08-27 13:05:20 +0200 |
| commit | 691def10a0197d83d2d108bd9043b0916d0f09b4 (patch) | |
| tree | 44d4c239fc2d887b9cd58eb9b8fccba09ed76171 /tests | |
| parent | 03dbdfd9bbbbd0b0172aad648c6bbe3f39541137 (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')
| -rw-r--r-- | tests/queryset_pickle/tests.py | 35 |
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')) |
