Skip to content

Commit dee7c0b

Browse files
committed
added selecting and prefetching of related fields to CreatureViewSet
1 parent 8733d54 commit dee7c0b

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

api_v2/views/creature.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,30 @@ class CreatureViewSet(viewsets.ReadOnlyModelViewSet):
6565
serializer_class = serializers.CreatureSerializer
6666
filterset_class = CreatureFilterSet
6767

68+
def get_queryset(self):
69+
# Retrieve depth from query params, default to 0 if not provided
70+
depth = int(self.request.query_params.get('depth', 0))
71+
queryset = CreatureViewSet.setup_eager_loading(super().get_queryset(), self.action, depth)
72+
return queryset
73+
74+
@staticmethod
75+
def setup_eager_loading(queryset, action, depth):
76+
# Apply select_related and prefetch_related based on action and depth
77+
if action == 'list':
78+
selects = ['type', 'size', 'document']
79+
80+
# Many-to-many and reverse relationships for prefetching
81+
prefetches = [
82+
'creatureaction_set', 'condition_immunities', 'damage_immunities',
83+
'damage_vulnerabilities', 'damage_resistances', 'environments',
84+
'document'
85+
]
86+
87+
if depth >= 2:
88+
prefetches += ['document__publisher', 'document__licenses', 'document__gamesystem']
89+
queryset = queryset.select_related(*selects).prefetch_related(*prefetches)
90+
return queryset
91+
6892

6993
class CreatureTypeFilterSet(FilterSet):
7094
class Meta:

0 commit comments

Comments
 (0)