optimized queries

This commit is contained in:
MassiveAtoms 2020-07-09 11:58:09 -03:00
parent caa3022cdf
commit 7d2b429cbe
5 changed files with 75 additions and 34 deletions

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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
@ -27,6 +26,7 @@ def sign_up(request):
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