From: Jan Szejko Date: Thu, 21 Apr 2016 12:37:06 +0000 (+0200) Subject: api optimization (book lists) X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/ab72083a61fc7a6257101b31ec92d12ea61c7a03?ds=sidebyside api optimization (book lists) --- diff --git a/src/api/handlers.py b/src/api/handlers.py index b81afdaf5..01430cbcb 100644 --- a/src/api/handlers.py +++ b/src/api/handlers.py @@ -6,6 +6,7 @@ import json from django.contrib.sites.models import Site from django.core.urlresolvers import reverse +from django.db.models import Prefetch from django.utils.functional import lazy from piston.handler import AnonymousBaseHandler, BaseHandler from piston.utils import rc @@ -13,6 +14,7 @@ from sorl.thumbnail import default from catalogue.forms import BookImportForm from catalogue.models import Book, Tag, BookMedia, Fragment, Collection +from catalogue.models.tag import TagRelation from picture.models import Picture from picture.forms import PictureImportForm @@ -206,7 +208,14 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): if daisy: books = books.filter(media__type='daisy').distinct() - books = books.only('slug', 'title', 'cover') + books = books.only('slug', 'title', 'cover', 'cover_thumb') + for category in book_tag_categories: + books = books.prefetch_related( + Prefetch( + 'tag_relations', + queryset=TagRelation.objects.filter(tag__category=category) + .select_related('tag').only('tag__name_pl', 'object_id'), + to_attr='%s_relations' % category)) if books: return books @@ -251,6 +260,8 @@ def _tags_getter(category): def _tag_getter(category): @classmethod def get_tag(cls, book): + if hasattr(book, '%s_relations' % category): + return ', '.join(rel.tag.name for rel in getattr(book, '%s_relations' % category)) return ', '.join(book.tags.filter(category=category).values_list('name', flat=True)) return get_tag