Skip to content

Commit a468689

Browse files
committed
Fixed QuerySet._fetch_all() executed prepare_objects() many times.
1 parent e02bc04 commit a468689

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

django_qserializer/serialization.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ def to_serialize(self, serializer=None):
107107
return self._serializer._prepare_queryset(self)
108108

109109
def _fetch_all(self):
110+
result_already_cached = self._result_cache is not None
110111
super()._fetch_all()
111-
if not self._result_cache:
112+
if result_already_cached or not self._result_cache:
112113
return
113114

114115
serializer = self.serializer

django_qserializer/tests/test_serializer.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest.mock import Mock
2+
13
import pytest
24

35
from django_qserializer import BaseSerializer, serialize
@@ -205,3 +207,21 @@ def test_values(bus_fixture):
205207

206208
def test_empty_result(db):
207209
Bus.objects.to_serialize(BaseSerializer).first()
210+
211+
212+
def test_fetch_all_idempotent(bus_fixture):
213+
"""
214+
Regression test. `QuerySet._fetch_all` is called a lot of times and Django
215+
execute queries once.
216+
"""
217+
class S(BaseSerializer):
218+
prepare_objects = Mock()
219+
220+
buses = Bus.objects.to_serialize(S).all()
221+
222+
list(buses)
223+
S.prepare_objects.assert_called_once()
224+
225+
list(buses)
226+
# The `prepare_objects` method was not called again.
227+
S.prepare_objects.assert_called_once()

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[metadata]
22
name = django_qserializer
3-
version = 0.2.7
3+
version = 0.2.8
44
url = https://github.com/buserbrasil/django-qserializer
55
license = MIT
66
author = Iuri de Silvio

0 commit comments

Comments
 (0)