Skip to content

Commit e5509ca

Browse files
authored
Merge pull request #21 from MaxDude132/bugfix/20
Fix non-model serializer fields being inclided in the prefetching
2 parents efcde2f + 00ce0a6 commit e5509ca

File tree

4 files changed

+41
-5
lines changed

4 files changed

+41
-5
lines changed

serializer_prefetch/base.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,16 +253,23 @@ def _get_serializer_field_relations(
253253
if current_relation:
254254
source = self._get_joined_prefetch(current_relation, source)
255255

256-
append_to.append(source)
257-
258256
add_to_select, add_to_prefetch = self.get_prefetch(
259257
field,
260258
current_relation=source,
261259
should_prefetch=future_should_prefetch,
262260
)
263261

264-
select_items.extend(add_to_select)
265-
prefetch_items.extend(add_to_prefetch)
262+
meta = (
263+
getattr(field.child, "Meta", None)
264+
if isinstance(field, serializers.ListSerializer)
265+
else getattr(field, "Meta", None)
266+
)
267+
if meta:
268+
model = getattr(meta, "model", None)
269+
if meta and model:
270+
append_to.append(source)
271+
select_items.extend(add_to_select)
272+
prefetch_items.extend(add_to_prefetch)
266273

267274
return select_items, prefetch_items
268275

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.4"
7+
VERSION = "1.1.5"
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/models.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class Pizza(models.Model):
1515
label = models.CharField(max_length=50)
1616
provenance = models.ForeignKey(Country, on_delete=models.CASCADE)
1717

18+
extra_data = models.JSONField(null=True)
19+
1820

1921
class Topping(models.Model):
2022
pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE, related_name="toppings")

tests/test_serializers.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,3 +896,30 @@ class Meta:
896896
},
897897
],
898898
)
899+
900+
def test_non_model_serializer_not_prefetched(self):
901+
class ExtraDataSerializer(serializers.Serializer):
902+
label = serializers.CharField()
903+
904+
class PizzaSerializer(PrefetchingSerializerMixin, serializers.ModelSerializer):
905+
extra_data = ExtraDataSerializer()
906+
907+
class Meta:
908+
model = Pizza
909+
fields = ("label", "extra_data")
910+
911+
Pizza.objects.create(
912+
label="Margherita",
913+
extra_data={"label": "Margherita"},
914+
provenance=self.canada,
915+
)
916+
pizzas = Pizza.objects.filter(label="Margherita")
917+
serializer = PizzaSerializer(pizzas, many=True)
918+
919+
with self.assertNumQueries(1):
920+
data = serializer.data
921+
922+
self.assertEqual(
923+
data,
924+
[{"label": "Margherita", "extra_data": {"label": "Margherita"}}],
925+
)

0 commit comments

Comments
 (0)