@@ -223,10 +223,10 @@ def get(self, request, *args, **kwargs):
223
223
return Response (data )
224
224
225
225
226
- class NoLinksMixin :
227
- """Mixin to remove conflicting fields from serializers."""
226
+ class RemoveFieldsMixin :
227
+ """Mixin to remove fields from serializers."""
228
228
229
- FIELDS_TO_REMOVE = ( "_links" ,)
229
+ FIELDS_TO_REMOVE = []
230
230
231
231
def __init__ (self , * args , ** kwargs ):
232
232
super ().__init__ (* args , ** kwargs )
@@ -245,20 +245,32 @@ def __init__(self, *args, **kwargs):
245
245
# on El Proxito.
246
246
#
247
247
# See https://github.com/readthedocs/readthedocs-ops/issues/1323
248
- class RelatedProjectSerializerNoLinks (NoLinksMixin , RelatedProjectSerializer ):
249
- pass
248
+ class RelatedProjectAddonsSerializer (RemoveFieldsMixin , RelatedProjectSerializer ):
249
+ FIELDS_TO_REMOVE = [
250
+ "_links" ,
251
+ ]
250
252
251
253
252
- class ProjectSerializerNoLinks (NoLinksMixin , ProjectSerializer ):
253
- related_project_serializer = RelatedProjectSerializerNoLinks
254
+ class ProjectAddonsSerializer (RemoveFieldsMixin , ProjectSerializer ):
255
+ FIELDS_TO_REMOVE = [
256
+ "_links" ,
257
+ # users and tags result in additional queries for fields that we don't use.
258
+ "users" ,
259
+ "tags" ,
260
+ ]
261
+ related_project_serializer = RelatedProjectAddonsSerializer
254
262
255
263
256
- class VersionSerializerNoLinks (NoLinksMixin , VersionSerializer ):
257
- pass
264
+ class VersionAddonsSerializer (RemoveFieldsMixin , VersionSerializer ):
265
+ FIELDS_TO_REMOVE = [
266
+ "_links" ,
267
+ ]
258
268
259
269
260
- class BuildSerializerNoLinks (NoLinksMixin , BuildSerializer ):
261
- pass
270
+ class BuildAddonsSerializer (RemoveFieldsMixin , BuildSerializer ):
271
+ FIELDS_TO_REMOVE = [
272
+ "_links" ,
273
+ ]
262
274
263
275
264
276
class AddonsResponseBase :
@@ -371,21 +383,21 @@ def _v1(self, project, version, build, filename, url, request):
371
383
request = request , project = project , version = version , resolver = resolver
372
384
),
373
385
"versions" : {
374
- "current" : VersionSerializerNoLinks (
386
+ "current" : VersionAddonsSerializer (
375
387
version ,
376
388
resolver = resolver ,
377
389
).data
378
390
if version
379
391
else None ,
380
392
# These are "sorted active, built, not hidden versions"
381
- "active" : VersionSerializerNoLinks (
393
+ "active" : VersionAddonsSerializer (
382
394
sorted_versions_active_built_not_hidden ,
383
395
resolver = resolver ,
384
396
many = True ,
385
397
).data ,
386
398
},
387
399
"builds" : {
388
- "current" : BuildSerializerNoLinks (build ).data if build else None ,
400
+ "current" : BuildAddonsSerializer (build ).data if build else None ,
389
401
},
390
402
# TODO: consider creating one serializer per field here.
391
403
# The resulting JSON will be the same, but maybe it's easier/cleaner?
@@ -594,14 +606,13 @@ def _get_projects_response(self, *, request, project, version, resolver):
594
606
# NOTE: there is no need to prefetch superprojects,
595
607
# as translations are not expected to have superprojects,
596
608
# and the serializer already checks for that.
597
- .prefetch_related ("tags" , "domains" , "users" )
598
609
)
599
610
# NOTE: we check if there are translations first,
600
611
# otherwise evaluating the queryset will be more expensive
601
612
# even if there are no results. Django optimizes the queryset
602
613
# if only we need to check if there are results or not.
603
614
if translations_qs .exists ():
604
- translations = ProjectSerializerNoLinks (
615
+ translations = ProjectAddonsSerializer (
605
616
translations_qs ,
606
617
resolver = resolver ,
607
618
version = version ,
@@ -611,7 +622,7 @@ def _get_projects_response(self, *, request, project, version, resolver):
611
622
translations = []
612
623
613
624
return {
614
- "current" : ProjectSerializerNoLinks (
625
+ "current" : ProjectAddonsSerializer (
615
626
project ,
616
627
resolver = resolver ,
617
628
version = version ,
0 commit comments