Skip to content

Commit cfc070b

Browse files
authored
Merge pull request #24 from MaxDude132/23-make-the-prefetching-work-for-all-parent-containers-not-just-listserializer
23 - Fix prefetching issue when using DictField
2 parents e411853 + 21fef5e commit cfc070b

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

serializer_prefetch/base.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,11 @@ def _get_fields(self, serializer: serializers.Field):
216216
if field.write_only:
217217
continue
218218

219-
if not isinstance(field, serializers.BaseSerializer):
219+
child = getattr(field, "child", None)
220+
221+
if not isinstance(field, serializers.BaseSerializer) and not isinstance(
222+
child, serializers.BaseSerializer
223+
):
220224
continue
221225

222226
yield field
@@ -233,9 +237,7 @@ def _get_serializer_field_relations(
233237
force_prefetch = self.get_force_prefetch_data(serializer)
234238

235239
for field in self._get_fields(serializer):
236-
future_should_prefetch = should_prefetch or isinstance(
237-
field, serializers.ListSerializer
238-
)
240+
future_should_prefetch = should_prefetch or hasattr(field, "child")
239241

240242
source = getattr(field, "_prefetch_source", None) or field.source
241243

@@ -283,7 +285,7 @@ def _get_serializer_field_relations(
283285

284286
meta = (
285287
getattr(field.child, "Meta", None)
286-
if isinstance(field, serializers.ListSerializer)
288+
if hasattr(field, "child")
287289
else getattr(field, "Meta", None)
288290
)
289291
if meta:

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# drf-serializer-prefetch
55
from setuptools import find_packages, setup
66

7-
VERSION = "1.1.7"
7+
VERSION = "1.1.8"
88
DESCRIPTION = "An automatic prefetcher for django-rest-framework."
99
this_directory = Path(__file__).parent
1010
LONG_DESCRIPTION = (this_directory / "README.md").read_text()

tests/test_serializers.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,3 +923,24 @@ class Meta:
923923
data,
924924
[{"label": "Margherita", "extra_data": {"label": "Margherita"}}],
925925
)
926+
927+
def test_dict_serializer(self):
928+
class ToppingDictSerializer(serializers.DictField):
929+
child = ToppingSerializer()
930+
931+
def to_representation(self, value):
932+
value = {obj.label: ToppingSerializer(obj).data for obj in value.all()}
933+
return super().to_representation(value)
934+
935+
class PizzaSerializer(PrefetchingSerializerMixin, serializers.ModelSerializer):
936+
toppings = ToppingDictSerializer()
937+
938+
class Meta:
939+
model = Pizza
940+
fields = ("label", "toppings")
941+
942+
pizzas = Pizza.objects.all()
943+
serializer = PizzaSerializer(pizzas, many=True)
944+
945+
with self.assertNumQueries(2):
946+
serializer.data

0 commit comments

Comments
 (0)