misc: keep cache of queryset result after __iter__ usage (#33013)

This commit is contained in:
Frédéric Péters 2019-05-12 08:40:38 +02:00
parent ad6385bb28
commit e03fa5924d
2 changed files with 15 additions and 6 deletions

View File

@ -786,6 +786,11 @@ def test_lazy_formdata_queryset(pub, variable_test_data):
for draft in qs:
assert draft.internal_id == formdata.id
# check __iter__ creates a cached resultset
qs = lazy_formdata.objects.drafts()
for formdata1, formdata2 in zip(list(qs), list(qs)):
assert formdata1 is formdata2
# check ordering
qs = lazy_formdata.objects.pending().order_by('id')
assert [x.number for x in qs] == ['1-1', '1-2', '1-3', '1-4', '1-5', '1-6', '1-7']

View File

@ -111,18 +111,22 @@ class LazyFormDefObjectsManager(object):
def __getitem__(self, key):
if self._cached_resultset is None:
self._cached_resultset = self._formdef.data_class().select(
clause=self._criterias, order_by=self._order_by)
return LazyFormData(self._cached_resultset[key])
self._cached_resultset = [LazyFormData(x) for x in
self._formdef.data_class().select(clause=self._criterias, order_by=self._order_by)]
return self._cached_resultset[key]
def __iter__(self):
if self._cached_resultset:
for formdata in self._cached_resultset:
yield LazyFormData(formdata)
for lazy_formdata in self._cached_resultset:
yield lazy_formdata
data_class = self._formdef.data_class()
temp_cached_resultset = []
for formdata in self._formdef.data_class().select_iterator(
clause=self._criterias, order_by=self._order_by):
yield LazyFormData(formdata)
lazy_formdata = LazyFormData(formdata)
temp_cached_resultset.append(lazy_formdata)
yield lazy_formdata
self._cached_resultset = temp_cached_resultset
def __nonzero__(self):
return any(self)