У меня есть 3 модели:
class Author(models.Model):
title = CharField()
class Genre(models.Model):
title = CharField()
class Book(models.Model):
title = CharField()
author = ManyToManyField(Author)
genre = ManyToManyField(Genre)
И у меня есть форма флажка (множественный выбор) со всеми жанрами и авторами, где значением флажка является идентификатор элемента (жанра или автора).
Цель: Показать книги с выбранными авторами или жанрами (без дубликатов)
Я могу сделать это двумя способами:
Первый способ:
if request.POST:
book_list = Book.objects.all() #get all books from db
books = []
request_list = request.POST.getlist('genre') #select list of genres in request
for item in request_list:
add_book = report_list.filter(genre=r_request) #queryset of book filtered by each genre
books.append(add_book)
book_list = book_list.exclude(genre=item)
request_list = request.POST.getlist('author') #select list of authors in request
for item in request_list:
add_book = report_list.filter(author=item) #queryset of book filtered by each author
books.append(add_book)
book_list = book_list.exclude(author=item)
return ...
'books': books
Но этот путь очень медленный , когда я выбираю много авторов и жанров, потому что исключение очень медленное.
Второй способ:
Удалить book_list = book_list.exclude (...) и применить шаблонный тег {% ifchanged book.id%}
Но я думаю, это будет оченьслишком медленно, когда я получу более 1000 книг в результате запроса (книги)
Как быстро показать книги с выбранными авторами и жанрами?