私は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)
そして、チェックボックスの値がアイテム(ジャンルまたは作者)IDである、すべてのジャンルと作者を含むチェックボックスフォーム(複数選択)があります。
目的:選択した著者またはジャンルの本を表示する (重複なし)
私は2つの方法でこれを行うことができます:
最初の方法:
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
しかし、多くの著者やジャンルを選択すると、除外が非常に遅いため、この方法は非常に遅くなります。
2 番目の方法:
book_list = book_list.exclude(...)を削除し、テンプレート タグ {% ifchanged book.id %} を適用します
しかし、リクエスト結果(本)で1000冊以上の本を取得すると、これも非常に遅くなると思います
選択した著者とジャンルの本をすばやく表示するにはどうすればよいですか?