/ / "through"で定義された検索モデル - django、models、m2m

"through"で定義された検索モデル - django、models、m2m

私は次のモデルを持っています(詳細は省略):

class Author(models.Model):
name = models.CharField("name", max_length=200, blank=False)

class Book(models.Model):
title = models.CharField("title", max_length=200, blank=False)
author = models.ManyToManyField(Author, blank=False, through="Book_Author")

class Book_Author(models.Model):
book = models.ForeignKey(Book)
author = models.ForeignKey(Author)

タイトルに与えられたクエリが含まれていて、著者の名前に同じクエリが含まれているすべての書籍を取得したい。

今私は次のことをしています:

タイトルに単語が含まれるすべての書籍を取得するには、このコードを使用します。

for word in words:
books = books.filter(Q(title__icontains=word)

著者の名前に単語が含まれているすべての書籍を取得するには、このコードを使用します。

for word in words:
authors = authors.filter(Q(name__icontains=word))
for author in authors:
for book_author in author.book_author_set.all():
book = Book.objects.get(id=book_author.book_id)
results.append(book)

2番目の部分を改善する方法はありますか?

回答:

回答№1は2

これは簡単な方法です:

for word in words:
books = books.filter(Q(title__icontains=word) )
books = books.filter(Q(author__name__icontains=word) )

my_books = books.distinct()

* EDITED *

タイトルに単語が含まれている書籍や著者に単語が含まれている書籍を探している場合、クエリは次のようになります。

q_books = None
q_authors = None
for word in words:
q_aux = Q(title__icontains=word)
q_books = (q_books & q_aux ) if bool( q_books) else q_aux
q_aux = Q(author__name__icontains=word)
q_authors = (q_authors & q_aux ) if bool( q_authors) else q_aux

my_books = Book.objects.filter( q_books | q_authors ).distinct()

コードの可読性を向上させるためのコメントはすべて妥当です。