|
| 1 | +from collections import defaultdict |
| 2 | + |
1 | 3 | from rest_framework import exceptions |
2 | 4 | from rest_framework import serializers |
3 | 5 | from rest_framework.fields import ReadOnlyField |
@@ -158,11 +160,38 @@ class Meta: |
158 | 160 | read_only_fields = fields |
159 | 161 |
|
160 | 162 |
|
| 163 | +class BufferListSerializer(serializers.ListSerializer): |
| 164 | + def to_representation(self, data): |
| 165 | + buffers = list(data) |
| 166 | + if buffers: |
| 167 | + rmcb_map = defaultdict(list) |
| 168 | + transfer_session_ids = {b.transfer_session_id for b in buffers} |
| 169 | + # Morango implementation will only ever call this for one transfer session ID at a time, |
| 170 | + # but a loop makes the code straightforward regardless and limits the quantity of |
| 171 | + # SQLite variables in use |
| 172 | + for transfer_session_id in transfer_session_ids: |
| 173 | + # bulk-fetch all RMCB records needed for this batch of buffers in a |
| 174 | + # single query, then cache the relevant subset on each buffer, instead |
| 175 | + # of letting each buffer's nested rmcb_list serializer issue its own query |
| 176 | + rmcb_queryset = RecordMaxCounterBuffer.objects.filter( |
| 177 | + transfer_session_id=transfer_session_id, |
| 178 | + model_uuid__in={b.model_uuid for b in buffers if b.transfer_session_id == transfer_session_id}, |
| 179 | + ) |
| 180 | + for rmcb in rmcb_queryset: |
| 181 | + rmcb_map[(transfer_session_id, rmcb.model_uuid)].append(rmcb) |
| 182 | + for buffer in buffers: |
| 183 | + buffer._rmcb_list = rmcb_map[ |
| 184 | + (buffer.transfer_session_id, buffer.model_uuid) |
| 185 | + ] |
| 186 | + return super(BufferListSerializer, self).to_representation(buffers) |
| 187 | + |
| 188 | + |
161 | 189 | class BufferSerializer(serializers.ModelSerializer): |
162 | 190 | rmcb_list = RecordMaxCounterBufferSerializer(many=True) |
163 | 191 |
|
164 | 192 | class Meta: |
165 | 193 | model = Buffer |
| 194 | + list_serializer_class = BufferListSerializer |
166 | 195 | fields = ( |
167 | 196 | "serialized", |
168 | 197 | "deleted", |
|
0 commit comments