optimized queries
This commit is contained in:
		@@ -14,7 +14,8 @@ import os
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 | 
					# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
 | 
				
			||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 | 
					BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 | 
				
			||||||
CALIBRE_DIR = os.path.abspath("C:\\Users\\MassiveAtoms\\Documents\\Calibre Library")
 | 
					CALIBRE_DIR = os.path.abspath(
 | 
				
			||||||
 | 
					    "C:\\Users\\MassiveAtoms\\Documents\\Calibre Library")
 | 
				
			||||||
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
 | 
					EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,14 +37,31 @@ STATIC_URL = '/static/'
 | 
				
			|||||||
SECRET_KEY = 'u(8^+rb%rz5hsx4v^^y(ul7g(4n7a8!db@s*9(m5cs*2_ppy8+'
 | 
					SECRET_KEY = 'u(8^+rb%rz5hsx4v^^y(ul7g(4n7a8!db@s*9(m5cs*2_ppy8+'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ALLOWED_HOSTS = []
 | 
					ALLOWED_HOSTS = ['127.0.0.1', ]
 | 
				
			||||||
 | 
					INTERNAL_IPS = [
 | 
				
			||||||
#### Don't change things beyond this
 | 
					    # ...
 | 
				
			||||||
 | 
					    '127.0.0.1',
 | 
				
			||||||
 | 
					    # ...
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					# Don't change things beyond this
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# SECURITY WARNING: don't run with debug turned on in production!
 | 
					# SECURITY WARNING: don't run with debug turned on in production!
 | 
				
			||||||
DEBUG = True
 | 
					DEBUG = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEBUG_TOOLBAR_PANELS = [
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.timer.TimerPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.headers.HeadersPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.request.RequestPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.sql.SQLPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.templates.TemplatesPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.cache.CachePanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.signals.SignalsPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.redirects.RedirectsPanel',
 | 
				
			||||||
 | 
					    'debug_toolbar.panels.profiling.ProfilingPanel',
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,10 +77,12 @@ INSTALLED_APPS = [
 | 
				
			|||||||
    'django.contrib.sessions',
 | 
					    'django.contrib.sessions',
 | 
				
			||||||
    'django.contrib.messages',
 | 
					    'django.contrib.messages',
 | 
				
			||||||
    'django.contrib.staticfiles',
 | 
					    'django.contrib.staticfiles',
 | 
				
			||||||
    "library"
 | 
					    "library",
 | 
				
			||||||
 | 
					    # 'debug_toolbar', # for debugging purposes
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MIDDLEWARE = [
 | 
					MIDDLEWARE = [
 | 
				
			||||||
 | 
					    # 'debug_toolbar.middleware.DebugToolbarMiddleware',
 | 
				
			||||||
    'django.middleware.security.SecurityMiddleware',
 | 
					    'django.middleware.security.SecurityMiddleware',
 | 
				
			||||||
    'django.contrib.sessions.middleware.SessionMiddleware',
 | 
					    'django.contrib.sessions.middleware.SessionMiddleware',
 | 
				
			||||||
    'django.middleware.common.CommonMiddleware',
 | 
					    'django.middleware.common.CommonMiddleware',
 | 
				
			||||||
@@ -111,9 +131,6 @@ DATABASES = {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DATABASE_ROUTERS = ["db_routers.DjangoRouter", "db_routers.CalibreRouter"]
 | 
					DATABASE_ROUTERS = ["db_routers.DjangoRouter", "db_routers.CalibreRouter"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Password validation
 | 
					# Password validation
 | 
				
			||||||
@@ -147,5 +164,3 @@ USE_I18N = True
 | 
				
			|||||||
USE_L10N = True
 | 
					USE_L10N = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
USE_TZ = True
 | 
					USE_TZ = True
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,11 +18,20 @@ from django.urls import path, include
 | 
				
			|||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
from django.conf.urls.static import static
 | 
					from django.conf.urls.static import static
 | 
				
			||||||
from django.views.generic import RedirectView
 | 
					from django.views.generic import RedirectView
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.urls import include, path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
urlpatterns = [
 | 
					urlpatterns = [
 | 
				
			||||||
    path('admin/', admin.site.urls),
 | 
					    path('admin/', admin.site.urls),
 | 
				
			||||||
    path('accounts/', include('django.contrib.auth.urls')),
 | 
					    path('accounts/', include('django.contrib.auth.urls')),
 | 
				
			||||||
    path('', include('library.urls')),
 | 
					    path('', include('library.urls')),
 | 
				
			||||||
    path('', RedirectView.as_view(url='books/', permanent=True)),
 | 
					    path('', RedirectView.as_view(url='books/', permanent=True)),
 | 
				
			||||||
]
 | 
					] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 | 
				
			||||||
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# if settings.DEBUG: # for DEBUGging purposes
 | 
				
			||||||
 | 
					#     import debug_toolbar
 | 
				
			||||||
 | 
					#     urlpatterns = [
 | 
				
			||||||
 | 
					#         path('__debug__/', include(debug_toolbar.urls)),
 | 
				
			||||||
 | 
					#     ] + urlpatterns
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,11 +14,11 @@
 | 
				
			|||||||
        <th onclick="sortTable(3)">Tags</th>
 | 
					        <th onclick="sortTable(3)">Tags</th>
 | 
				
			||||||
        <th onclick="sortTable(4)">Added</th>
 | 
					        <th onclick="sortTable(4)">Added</th>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    {% for book in publisher.released.all %}
 | 
					    {% for book in books %}
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <td><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></td>
 | 
					        <td><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></td>
 | 
				
			||||||
        <td>{{book.author_sort}}</td>
 | 
					        <td>{{book.author_sort}}</td>
 | 
				
			||||||
        <td> {% for rating in book.ratings.all %}
 | 
					        <td> {% for rating in book.rating.all %}
 | 
				
			||||||
            {{rating}}
 | 
					            {{rating}}
 | 
				
			||||||
            {% endfor %}
 | 
					            {% endfor %}
 | 
				
			||||||
        </td>
 | 
					        </td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,7 +13,7 @@
 | 
				
			|||||||
    <th onclick="sortTable(3)">Tags</th>
 | 
					    <th onclick="sortTable(3)">Tags</th>
 | 
				
			||||||
    <th onclick="sortTable(4)">Added</th>
 | 
					    <th onclick="sortTable(4)">Added</th>
 | 
				
			||||||
  </tr>
 | 
					  </tr>
 | 
				
			||||||
  {% for book in books_list %}
 | 
					  {% for book in book_list %}
 | 
				
			||||||
  <tr>
 | 
					  <tr>
 | 
				
			||||||
    <td><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></td>
 | 
					    <td><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></td>
 | 
				
			||||||
    <td>{{book.author_sort}}</td>
 | 
					    <td>{{book.author_sort}}</td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,6 @@ from django.http import HttpResponseRedirect
 | 
				
			|||||||
from .forms import SearchForm, UserCreationForm
 | 
					from .forms import SearchForm, UserCreationForm
 | 
				
			||||||
from django.db import models
 | 
					from django.db import models
 | 
				
			||||||
from django.db.models import Q
 | 
					from django.db.models import Q
 | 
				
			||||||
# from django.contrib.auth.forms import UserCreationForm
 | 
					 | 
				
			||||||
from django.contrib.auth.models import User
 | 
					from django.contrib.auth.models import User
 | 
				
			||||||
from django.contrib.auth import login
 | 
					from django.contrib.auth import login
 | 
				
			||||||
from django.contrib.auth.decorators import login_required
 | 
					from django.contrib.auth.decorators import login_required
 | 
				
			||||||
@@ -13,7 +12,7 @@ from django.contrib.auth.decorators import login_required
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@login_required
 | 
					@login_required
 | 
				
			||||||
def index(request):
 | 
					def index(request):
 | 
				
			||||||
    return render(request,'accounts/index.html')
 | 
					    return render(request, 'accounts/index.html')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def sign_up(request):
 | 
					def sign_up(request):
 | 
				
			||||||
@@ -22,10 +21,11 @@ def sign_up(request):
 | 
				
			|||||||
    if request.method == "POST":
 | 
					    if request.method == "POST":
 | 
				
			||||||
        if form.is_valid():
 | 
					        if form.is_valid():
 | 
				
			||||||
            user = form.save()
 | 
					            user = form.save()
 | 
				
			||||||
            login(request,user)
 | 
					            login(request, user)
 | 
				
			||||||
            return render(request,'registration/index.html')
 | 
					            return render(request, 'registration/index.html')
 | 
				
			||||||
    context['form']=form
 | 
					    context['form'] = form
 | 
				
			||||||
    return render(request,'registration/sign_up.html',context)
 | 
					    return render(request, 'registration/sign_up.html', context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SearchView(generic.TemplateView):
 | 
					class SearchView(generic.TemplateView):
 | 
				
			||||||
    template_name = 'search.html'
 | 
					    template_name = 'search.html'
 | 
				
			||||||
@@ -40,9 +40,12 @@ class ResultsView(generic.ListView):  # no clue if this is secure.
 | 
				
			|||||||
    def get_queryset(self):  # new
 | 
					    def get_queryset(self):  # new
 | 
				
			||||||
        title = self.request.GET.get('title')
 | 
					        title = self.request.GET.get('title')
 | 
				
			||||||
        author = self.request.GET.get('author')
 | 
					        author = self.request.GET.get('author')
 | 
				
			||||||
        return Book.objects.filter(
 | 
					        books = Book.objects.prefetch_related("tags", "ratings")
 | 
				
			||||||
            Q(sort__icontains=title) and Q(author_sort__icontains=author)
 | 
					        if title:
 | 
				
			||||||
        )
 | 
					            books =books.filter(sort__icontains=title)
 | 
				
			||||||
 | 
					        if author:
 | 
				
			||||||
 | 
					            books = books.filter(author_sort__icontains=author)
 | 
				
			||||||
 | 
					        return books
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AuthorListView(generic.ListView):
 | 
					class AuthorListView(generic.ListView):
 | 
				
			||||||
@@ -51,6 +54,11 @@ class AuthorListView(generic.ListView):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class BookListView(generic.ListView):
 | 
					class BookListView(generic.ListView):
 | 
				
			||||||
    model = Book
 | 
					    model = Book
 | 
				
			||||||
 | 
					    def get_queryset(self):
 | 
				
			||||||
 | 
					        # Annotate the books with ratings, tags, etc
 | 
				
			||||||
 | 
					        # books = Book.objects.annotate(
 | 
				
			||||||
 | 
					        queryset = Book.objects.prefetch_related("tags", "ratings")
 | 
				
			||||||
 | 
					        return queryset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PublisherListView(generic.ListView):
 | 
					class PublisherListView(generic.ListView):
 | 
				
			||||||
@@ -72,9 +80,9 @@ class AuthorDetailView(generic.DetailView):
 | 
				
			|||||||
        # Call the base implementation first to get the context
 | 
					        # Call the base implementation first to get the context
 | 
				
			||||||
        context = super(AuthorDetailView, self).get_context_data(**kwargs)
 | 
					        context = super(AuthorDetailView, self).get_context_data(**kwargs)
 | 
				
			||||||
        # Create any data and add it to the context
 | 
					        # Create any data and add it to the context
 | 
				
			||||||
        books = BookAuthorLink.objects.filter(author=context["object"].id)
 | 
					        books = Book.objects.prefetch_related("tags", "ratings")
 | 
				
			||||||
        context['books'] = sorted(
 | 
					        books = books.filter(authors=context["object"].id)
 | 
				
			||||||
            [b.book for b in books.all()],  key=lambda x: x.title)
 | 
					        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -99,6 +107,15 @@ class BookDetailView(generic.DetailView):
 | 
				
			|||||||
class PublisherDetailView(generic.DetailView):
 | 
					class PublisherDetailView(generic.DetailView):
 | 
				
			||||||
    model = Publisher
 | 
					    model = Publisher
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
 | 
					        # Call the base implementation first to get the context
 | 
				
			||||||
 | 
					        context = super(PublisherDetailView, self).get_context_data(**kwargs)
 | 
				
			||||||
 | 
					        # Create any data and add it to the context
 | 
				
			||||||
 | 
					        books = Book.objects.prefetch_related("tags", "ratings")
 | 
				
			||||||
 | 
					        books = books.filter(publishers=context["object"].id)
 | 
				
			||||||
 | 
					        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
				
			||||||
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RatingDetailView(generic.DetailView):
 | 
					class RatingDetailView(generic.DetailView):
 | 
				
			||||||
    model = Rating
 | 
					    model = Rating
 | 
				
			||||||
@@ -107,9 +124,9 @@ class RatingDetailView(generic.DetailView):
 | 
				
			|||||||
        # Call the base implementation first to get the context
 | 
					        # Call the base implementation first to get the context
 | 
				
			||||||
        context = super(RatingDetailView, self).get_context_data(**kwargs)
 | 
					        context = super(RatingDetailView, self).get_context_data(**kwargs)
 | 
				
			||||||
        # Create any data and add it to the context
 | 
					        # Create any data and add it to the context
 | 
				
			||||||
        books = BookRatingLink.objects.filter(rating=context["object"].id)
 | 
					        books = Book.objects.prefetch_related("tags", "ratings")
 | 
				
			||||||
        context['books'] = sorted(
 | 
					        books = books.filter(ratings=context["object"].id)
 | 
				
			||||||
            [b.book for b in books.all()], key=lambda x: x.title)
 | 
					        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,7 +137,7 @@ class TagDetailView(generic.DetailView):
 | 
				
			|||||||
        # Call the base implementation first to get the context
 | 
					        # Call the base implementation first to get the context
 | 
				
			||||||
        context = super(TagDetailView, self).get_context_data(**kwargs)
 | 
					        context = super(TagDetailView, self).get_context_data(**kwargs)
 | 
				
			||||||
        # Create any data and add it to the context
 | 
					        # Create any data and add it to the context
 | 
				
			||||||
        books = BookTagLink.objects.filter(tag=context["object"].id)
 | 
					        books = Book.objects.prefetch_related("tags", "ratings")
 | 
				
			||||||
        context['books'] = sorted(
 | 
					        books = books.filter(tags=context["object"].id)
 | 
				
			||||||
            [b.book for b in books.all()],  key=lambda x: x.title)
 | 
					        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user