Skip to content
Snippets Groups Projects
Verified Commit 6b5cb975 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Improved SQL generated by ORM

parent 4e7f1e63
No related branches found
No related tags found
No related merge requests found
...@@ -284,7 +284,7 @@ class AlbumQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): ...@@ -284,7 +284,7 @@ class AlbumQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
class Album(APIModelMixin): class Album(APIModelMixin):
title = models.CharField(max_length=MAX_LENGTHS["ALBUM_TITLE"]) title = models.CharField(max_length=MAX_LENGTHS["ALBUM_TITLE"])
artist = models.ForeignKey(Artist, related_name="albums", on_delete=models.CASCADE) 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) release_group_id = models.UUIDField(null=True, blank=True)
cover = VersatileImageField( cover = VersatileImageField(
upload_to="albums/covers/%Y/%m/%d", null=True, blank=True upload_to="albums/covers/%Y/%m/%d", null=True, blank=True
...@@ -415,7 +415,7 @@ def import_album(v): ...@@ -415,7 +415,7 @@ def import_album(v):
class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
def for_nested_serialization(self): 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): def annotate_playable_by_actor(self, actor):
......
...@@ -50,7 +50,7 @@ def get_libraries(filter_uploads): ...@@ -50,7 +50,7 @@ def get_libraries(filter_uploads):
qs = models.Library.objects.filter( qs = models.Library.objects.filter(
pk__in=uploads.values_list("library", flat=True) pk__in=uploads.values_list("library", flat=True)
).annotate(_uploads_count=Count("uploads")) ).annotate(_uploads_count=Count("uploads"))
qs = qs.select_related("actor") qs = qs.prefetch_related("actor")
page = self.paginate_queryset(qs) page = self.paginate_queryset(qs)
if page is not None: if page is not None:
serializer = federation_api_serializers.LibrarySerializer(page, many=True) serializer = federation_api_serializers.LibrarySerializer(page, many=True)
...@@ -104,6 +104,7 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV ...@@ -104,6 +104,7 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV
to_attr="_prefetched_tracks", to_attr="_prefetched_tracks",
) )
) )
.order_by("-id")
) )
serializer_class = serializers.ArtistWithAlbumsSerializer serializer_class = serializers.ArtistWithAlbumsSerializer
permission_classes = [oauth_permissions.ScopePermission] permission_classes = [oauth_permissions.ScopePermission]
...@@ -147,8 +148,8 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV ...@@ -147,8 +148,8 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV
class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet): class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
queryset = ( queryset = (
models.Album.objects.all() models.Album.objects.all()
.order_by("artist", "release_date") .order_by("-creation_date")
.select_related("artist", "attributed_to") .prefetch_related("artist", "attributed_to")
) )
serializer_class = serializers.AlbumSerializer serializer_class = serializers.AlbumSerializer
permission_classes = [oauth_permissions.ScopePermission] permission_classes = [oauth_permissions.ScopePermission]
...@@ -173,7 +174,7 @@ class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi ...@@ -173,7 +174,7 @@ class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
def get_queryset(self): def get_queryset(self):
queryset = super().get_queryset() queryset = super().get_queryset()
tracks = ( tracks = (
models.Track.objects.select_related("artist") models.Track.objects.prefetch_related("artist")
.with_playable_uploads(utils.get_actor_from_request(self.request)) .with_playable_uploads(utils.get_actor_from_request(self.request))
.order_for_album() .order_for_album()
) )
...@@ -235,7 +236,7 @@ class LibraryViewSet( ...@@ -235,7 +236,7 @@ class LibraryViewSet(
library = self.get_object() library = self.get_object()
queryset = ( queryset = (
library.received_follows.filter(target__actor=self.request.user.actor) library.received_follows.filter(target__actor=self.request.user.actor)
.select_related("actor", "target__actor") .prefetch_related("actor", "target__actor")
.order_by("-creation_date") .order_by("-creation_date")
) )
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
...@@ -257,7 +258,8 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi ...@@ -257,7 +258,8 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
queryset = ( queryset = (
models.Track.objects.all() models.Track.objects.all()
.for_nested_serialization() .for_nested_serialization()
.select_related("attributed_to") .prefetch_related("attributed_to")
.order_by("-creation_date")
) )
serializer_class = serializers.TrackSerializer serializer_class = serializers.TrackSerializer
permission_classes = [oauth_permissions.ScopePermission] permission_classes = [oauth_permissions.ScopePermission]
...@@ -454,7 +456,9 @@ class ListenViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet): ...@@ -454,7 +456,9 @@ class ListenViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
def retrieve(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs):
track = self.get_object() track = self.get_object()
actor = utils.get_actor_from_request(request) 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") explicit_file = request.GET.get("upload")
if explicit_file: if explicit_file:
queryset = queryset.filter(uuid=explicit_file) queryset = queryset.filter(uuid=explicit_file)
...@@ -493,7 +497,7 @@ class UploadViewSet( ...@@ -493,7 +497,7 @@ class UploadViewSet(
queryset = ( queryset = (
models.Upload.objects.all() models.Upload.objects.all()
.order_by("-creation_date") .order_by("-creation_date")
.select_related("library", "track__artist", "track__album__artist") .prefetch_related("library", "track__artist", "track__album__artist")
) )
serializer_class = serializers.UploadForOwnerSerializer serializer_class = serializers.UploadForOwnerSerializer
permission_classes = [ permission_classes = [
...@@ -577,7 +581,7 @@ class Search(views.APIView): ...@@ -577,7 +581,7 @@ class Search(views.APIView):
qs = ( qs = (
models.Track.objects.all() models.Track.objects.all()
.filter(query_obj) .filter(query_obj)
.select_related("artist", "album__artist") .prefetch_related("artist", "album__artist")
) )
return common_utils.order_for_search(qs, "title")[: self.max_results] return common_utils.order_for_search(qs, "title")[: self.max_results]
...@@ -587,8 +591,7 @@ class Search(views.APIView): ...@@ -587,8 +591,7 @@ class Search(views.APIView):
qs = ( qs = (
models.Album.objects.all() models.Album.objects.all()
.filter(query_obj) .filter(query_obj)
.select_related() .prefetch_related("tracks__artist", "artist", "attributed_to")
.prefetch_related("tracks__artist")
) )
return common_utils.order_for_search(qs, "title")[: self.max_results] return common_utils.order_for_search(qs, "title")[: self.max_results]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment