0

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

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番目の部分を改善する方法はありますか?

4

1 に答える 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()

*編集済み*

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

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()

コードの可読性を高めるためのコメントは大歓迎です。

于 2012-07-30T11:16:36.647 に答える