diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 75126eda2..ba29a066b 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -284,7 +284,7 @@ class AlbumQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): class Album(APIModelMixin): title = models.CharField(max_length=MAX_LENGTHS["ALBUM_TITLE"]) artist = models.ForeignKey(Artist, related_name="albums", on_delete=models.CASCADE) - release_date = models.DateField(null=True, blank=True) + release_date = models.DateField(null=True, blank=True, db_index=True) release_group_id = models.UUIDField(null=True, blank=True) cover = VersatileImageField( upload_to="albums/covers/%Y/%m/%d", null=True, blank=True @@ -415,7 +415,7 @@ def import_album(v): class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): def for_nested_serialization(self): - return self.select_related().select_related("album__artist", "artist") + return self.prefetch_related("artist", "album__artist") def annotate_playable_by_actor(self, actor): diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py index 9de785116..580ac28b7 100644 --- a/api/funkwhale_api/music/views.py +++ b/api/funkwhale_api/music/views.py @@ -50,7 +50,7 @@ def get_libraries(filter_uploads): qs = models.Library.objects.filter( pk__in=uploads.values_list("library", flat=True) ).annotate(_uploads_count=Count("uploads")) - qs = qs.select_related("actor") + qs = qs.prefetch_related("actor") page = self.paginate_queryset(qs) if page is not None: serializer = federation_api_serializers.LibrarySerializer(page, many=True) @@ -104,6 +104,7 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV to_attr="_prefetched_tracks", ) ) + .order_by("-id") ) serializer_class = serializers.ArtistWithAlbumsSerializer permission_classes = [oauth_permissions.ScopePermission] @@ -147,8 +148,8 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet): queryset = ( models.Album.objects.all() - .order_by("artist", "release_date") - .select_related("artist", "attributed_to") + .order_by("-creation_date") + .prefetch_related("artist", "attributed_to") ) serializer_class = serializers.AlbumSerializer permission_classes = [oauth_permissions.ScopePermission] @@ -173,7 +174,7 @@ class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi def get_queryset(self): queryset = super().get_queryset() tracks = ( - models.Track.objects.select_related("artist") + models.Track.objects.prefetch_related("artist") .with_playable_uploads(utils.get_actor_from_request(self.request)) .order_for_album() ) @@ -235,7 +236,7 @@ class LibraryViewSet( library = self.get_object() queryset = ( library.received_follows.filter(target__actor=self.request.user.actor) - .select_related("actor", "target__actor") + .prefetch_related("actor", "target__actor") .order_by("-creation_date") ) page = self.paginate_queryset(queryset) @@ -257,7 +258,8 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi queryset = ( models.Track.objects.all() .for_nested_serialization() - .select_related("attributed_to") + .prefetch_related("attributed_to") + .order_by("-creation_date") ) serializer_class = serializers.TrackSerializer permission_classes = [oauth_permissions.ScopePermission] @@ -454,7 +456,9 @@ class ListenViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): def retrieve(self, request, *args, **kwargs): track = self.get_object() actor = utils.get_actor_from_request(request) - queryset = track.uploads.select_related("track__album__artist", "track__artist") + queryset = track.uploads.prefetch_related( + "track__album__artist", "track__artist" + ) explicit_file = request.GET.get("upload") if explicit_file: queryset = queryset.filter(uuid=explicit_file) @@ -493,7 +497,7 @@ class UploadViewSet( queryset = ( models.Upload.objects.all() .order_by("-creation_date") - .select_related("library", "track__artist", "track__album__artist") + .prefetch_related("library", "track__artist", "track__album__artist") ) serializer_class = serializers.UploadForOwnerSerializer permission_classes = [ @@ -577,7 +581,7 @@ class Search(views.APIView): qs = ( models.Track.objects.all() .filter(query_obj) - .select_related("artist", "album__artist") + .prefetch_related("artist", "album__artist") ) return common_utils.order_for_search(qs, "title")[: self.max_results] @@ -587,8 +591,7 @@ class Search(views.APIView): qs = ( models.Album.objects.all() .filter(query_obj) - .select_related() - .prefetch_related("tracks__artist") + .prefetch_related("tracks__artist", "artist", "attributed_to") ) return common_utils.order_for_search(qs, "title")[: self.max_results]