Verified Commit 16f631af authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Performance optimization on playlisttrack serialization

parent dd40a4c4
...@@ -94,6 +94,15 @@ class Playlist(models.Model): ...@@ -94,6 +94,15 @@ class Playlist(models.Model):
] ]
return PlaylistTrack.objects.bulk_create(plts) return PlaylistTrack.objects.bulk_create(plts)
class PlaylistTrackQuerySet(models.QuerySet):
def for_nested_serialization(self):
return (self.select_related()
.select_related('track__album__artist')
.prefetch_related(
'track__tags',
'track__files',
'track__artist__albums__tracks__tags'))
class PlaylistTrack(models.Model): class PlaylistTrack(models.Model):
track = models.ForeignKey( track = models.ForeignKey(
...@@ -105,6 +114,8 @@ class PlaylistTrack(models.Model): ...@@ -105,6 +114,8 @@ class PlaylistTrack(models.Model):
Playlist, related_name='playlist_tracks', on_delete=models.CASCADE) Playlist, related_name='playlist_tracks', on_delete=models.CASCADE)
creation_date = models.DateTimeField(default=timezone.now) creation_date = models.DateTimeField(default=timezone.now)
objects = PlaylistTrackQuerySet.as_manager()
class Meta: class Meta:
ordering = ('-playlist', 'index') ordering = ('-playlist', 'index')
unique_together = ('playlist', 'index') unique_together = ('playlist', 'index')
......
...@@ -46,7 +46,7 @@ class PlaylistViewSet( ...@@ -46,7 +46,7 @@ class PlaylistViewSet(
@detail_route(methods=['get']) @detail_route(methods=['get'])
def tracks(self, request, *args, **kwargs): def tracks(self, request, *args, **kwargs):
playlist = self.get_object() playlist = self.get_object()
plts = playlist.playlist_tracks.all() plts = playlist.playlist_tracks.all().for_nested_serialization()
serializer = serializers.PlaylistTrackSerializer(plts, many=True) serializer = serializers.PlaylistTrackSerializer(plts, many=True)
data = { data = {
'count': len(plts), 'count': len(plts),
...@@ -65,6 +65,9 @@ class PlaylistViewSet( ...@@ -65,6 +65,9 @@ class PlaylistViewSet(
except exceptions.ValidationError as e: except exceptions.ValidationError as e:
payload = {'playlist': e.detail} payload = {'playlist': e.detail}
return Response(payload, status=400) return Response(payload, status=400)
ids = [p.id for p in plts]
plts = models.PlaylistTrack.objects.filter(
pk__in=ids).order_by('index').for_nested_serialization()
serializer = serializers.PlaylistTrackSerializer(plts, many=True) serializer = serializers.PlaylistTrackSerializer(plts, many=True)
data = { data = {
'count': len(plts), 'count': len(plts),
...@@ -93,7 +96,7 @@ class PlaylistTrackViewSet( ...@@ -93,7 +96,7 @@ class PlaylistTrackViewSet(
viewsets.GenericViewSet): viewsets.GenericViewSet):
serializer_class = serializers.PlaylistTrackSerializer serializer_class = serializers.PlaylistTrackSerializer
queryset = (models.PlaylistTrack.objects.all()) queryset = (models.PlaylistTrack.objects.all().for_nested_serialization())
permission_classes = [ permission_classes = [
permissions.ConditionalAuthentication, permissions.ConditionalAuthentication,
permissions.OwnerPermission, permissions.OwnerPermission,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment