optimized queries
This commit is contained in:
parent
caa3022cdf
commit
7d2b429cbe
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user