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

Faster Search endpoint (less DB queries)

parent ceb0ec03
No related branches found
No related tags found
No related merge requests found
...@@ -39,7 +39,12 @@ class TagViewSetMixin(object): ...@@ -39,7 +39,12 @@ class TagViewSetMixin(object):
return queryset return queryset
class ArtistViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet): class ArtistViewSet(SearchMixin, viewsets.ReadOnlyModelViewSet):
queryset = models.Artist.objects.all().order_by('-creation_date').prefetch_related('albums__tracks__files', 'albums__tracks__tags') queryset = (
models.Artist.objects.all()
.order_by('-creation_date')
.prefetch_related(
'albums__tracks__files',
'albums__tracks__tags'))
serializer_class = serializers.ArtistSerializerNested serializer_class = serializers.ArtistSerializerNested
permission_classes = [ConditionalAuthentication] permission_classes = [ConditionalAuthentication]
search_fields = ['name'] search_fields = ['name']
...@@ -111,17 +116,45 @@ class Search(views.APIView): ...@@ -111,17 +116,45 @@ class Search(views.APIView):
def get_tracks(self, query): def get_tracks(self, query):
search_fields = ['mbid', 'title', 'album__title', 'artist__name'] search_fields = ['mbid', 'title', 'album__title', 'artist__name']
query_obj = utils.get_query(query, search_fields) query_obj = utils.get_query(query, search_fields)
return models.Track.objects.all().filter(query_obj)[:self.max_results] return (
models.Track.objects.all()
.filter(query_obj)
.select_related('album__artist')
.prefetch_related(
'tags',
'artist__albums__tracks__tags',
'files')
)[:self.max_results]
def get_albums(self, query): def get_albums(self, query):
search_fields = ['mbid', 'title', 'artist__name'] search_fields = ['mbid', 'title', 'artist__name']
query_obj = utils.get_query(query, search_fields) query_obj = utils.get_query(query, search_fields)
return models.Album.objects.all().filter(query_obj)[:self.max_results] return (
models.Album.objects.all()
.filter(query_obj)
.select_related()
.prefetch_related(
'tracks__tags',
'tracks__files',
)
)[:self.max_results]
def get_artists(self, query): def get_artists(self, query):
search_fields = ['mbid', 'name'] search_fields = ['mbid', 'name']
query_obj = utils.get_query(query, search_fields) query_obj = utils.get_query(query, search_fields)
return models.Artist.objects.all().filter(query_obj)[:self.max_results] return (
models.Artist.objects.all()
.filter(query_obj)
.select_related()
.prefetch_related(
'albums__tracks__tags',
'albums__tracks__files',
)
)[:self.max_results]
def get_tags(self, query): def get_tags(self, query):
search_fields = ['slug', 'name'] search_fields = ['slug', 'name']
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment