optimized queries
This commit is contained in:
		@@ -14,11 +14,11 @@
 | 
			
		||||
        <th onclick="sortTable(3)">Tags</th>
 | 
			
		||||
        <th onclick="sortTable(4)">Added</th>
 | 
			
		||||
    </tr>
 | 
			
		||||
    {% for book in publisher.released.all %}
 | 
			
		||||
    {% for book in books %}
 | 
			
		||||
    <tr>
 | 
			
		||||
        <td><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></td>
 | 
			
		||||
        <td>{{book.author_sort}}</td>
 | 
			
		||||
        <td> {% for rating in book.ratings.all %}
 | 
			
		||||
        <td> {% for rating in book.rating.all %}
 | 
			
		||||
            {{rating}}
 | 
			
		||||
            {% endfor %}
 | 
			
		||||
        </td>
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
    <th onclick="sortTable(3)">Tags</th>
 | 
			
		||||
    <th onclick="sortTable(4)">Added</th>
 | 
			
		||||
  </tr>
 | 
			
		||||
  {% for book in books_list %}
 | 
			
		||||
  {% for book in book_list %}
 | 
			
		||||
  <tr>
 | 
			
		||||
    <td><a href="{{ book.get_absolute_url }}">{{ book.title }}</a></td>
 | 
			
		||||
    <td>{{book.author_sort}}</td>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ from django.http import HttpResponseRedirect
 | 
			
		||||
from .forms import SearchForm, UserCreationForm
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.db.models import Q
 | 
			
		||||
# from django.contrib.auth.forms import UserCreationForm
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.contrib.auth import login
 | 
			
		||||
from django.contrib.auth.decorators import login_required
 | 
			
		||||
@@ -13,19 +12,20 @@ from django.contrib.auth.decorators import login_required
 | 
			
		||||
 | 
			
		||||
@login_required
 | 
			
		||||
def index(request):
 | 
			
		||||
    return render(request,'accounts/index.html')
 | 
			
		||||
    return render(request, 'accounts/index.html')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
def sign_up(request):
 | 
			
		||||
    context = {}
 | 
			
		||||
    form = UserCreationForm(request.POST or None)
 | 
			
		||||
    if request.method == "POST":
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            user = form.save()
 | 
			
		||||
            login(request,user)
 | 
			
		||||
            return render(request,'registration/index.html')
 | 
			
		||||
    context['form']=form
 | 
			
		||||
    return render(request,'registration/sign_up.html',context)
 | 
			
		||||
            login(request, user)
 | 
			
		||||
            return render(request, 'registration/index.html')
 | 
			
		||||
    context['form'] = form
 | 
			
		||||
    return render(request, 'registration/sign_up.html', context)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SearchView(generic.TemplateView):
 | 
			
		||||
    template_name = 'search.html'
 | 
			
		||||
@@ -40,9 +40,12 @@ class ResultsView(generic.ListView):  # no clue if this is secure.
 | 
			
		||||
    def get_queryset(self):  # new
 | 
			
		||||
        title = self.request.GET.get('title')
 | 
			
		||||
        author = self.request.GET.get('author')
 | 
			
		||||
        return Book.objects.filter(
 | 
			
		||||
            Q(sort__icontains=title) and Q(author_sort__icontains=author)
 | 
			
		||||
        )
 | 
			
		||||
        books = Book.objects.prefetch_related("tags", "ratings")
 | 
			
		||||
        if title:
 | 
			
		||||
            books =books.filter(sort__icontains=title)
 | 
			
		||||
        if author:
 | 
			
		||||
            books = books.filter(author_sort__icontains=author)
 | 
			
		||||
        return books
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AuthorListView(generic.ListView):
 | 
			
		||||
@@ -51,6 +54,11 @@ class AuthorListView(generic.ListView):
 | 
			
		||||
 | 
			
		||||
class BookListView(generic.ListView):
 | 
			
		||||
    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):
 | 
			
		||||
@@ -72,9 +80,9 @@ class AuthorDetailView(generic.DetailView):
 | 
			
		||||
        # Call the base implementation first to get the context
 | 
			
		||||
        context = super(AuthorDetailView, self).get_context_data(**kwargs)
 | 
			
		||||
        # Create any data and add it to the context
 | 
			
		||||
        books = BookAuthorLink.objects.filter(author=context["object"].id)
 | 
			
		||||
        context['books'] = sorted(
 | 
			
		||||
            [b.book for b in books.all()],  key=lambda x: x.title)
 | 
			
		||||
        books = Book.objects.prefetch_related("tags", "ratings")
 | 
			
		||||
        books = books.filter(authors=context["object"].id)
 | 
			
		||||
        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -99,6 +107,15 @@ class BookDetailView(generic.DetailView):
 | 
			
		||||
class PublisherDetailView(generic.DetailView):
 | 
			
		||||
    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):
 | 
			
		||||
    model = Rating
 | 
			
		||||
@@ -107,9 +124,9 @@ class RatingDetailView(generic.DetailView):
 | 
			
		||||
        # Call the base implementation first to get the context
 | 
			
		||||
        context = super(RatingDetailView, self).get_context_data(**kwargs)
 | 
			
		||||
        # Create any data and add it to the context
 | 
			
		||||
        books = BookRatingLink.objects.filter(rating=context["object"].id)
 | 
			
		||||
        context['books'] = sorted(
 | 
			
		||||
            [b.book for b in books.all()], key=lambda x: x.title)
 | 
			
		||||
        books = Book.objects.prefetch_related("tags", "ratings")
 | 
			
		||||
        books = books.filter(ratings=context["object"].id)
 | 
			
		||||
        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -120,7 +137,7 @@ class TagDetailView(generic.DetailView):
 | 
			
		||||
        # Call the base implementation first to get the context
 | 
			
		||||
        context = super(TagDetailView, self).get_context_data(**kwargs)
 | 
			
		||||
        # Create any data and add it to the context
 | 
			
		||||
        books = BookTagLink.objects.filter(tag=context["object"].id)
 | 
			
		||||
        context['books'] = sorted(
 | 
			
		||||
            [b.book for b in books.all()],  key=lambda x: x.title)
 | 
			
		||||
        books = Book.objects.prefetch_related("tags", "ratings")
 | 
			
		||||
        books = books.filter(tags=context["object"].id)
 | 
			
		||||
        context['books'] = sorted(books,  key=lambda x: x.title)
 | 
			
		||||
        return context
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user