2011-06-28 6 views
0

私の質問のタイトルは本当に正しいものではありませんが、私はそれをどう語るべきかは分かりませんでした。クエリーセットに値を追加

私は書籍の集まりを持っています。

Book.objects.all() 

私は本の関係を持っている:

class BookRelation(models.Model): 
    user = models.ForeignKey(User, related_name='books') 
    book = models.ForeignKey(Book, related_name='users') 

    STATES = (
     (0, 'wishlist'), 
     (1, 'reading'), 
     (2, 'read'), 
    ) 

私は本のクエリセットを示していますが、私は視覚的にユーザーが書籍に関係を持っていることを示したいビューを持っています。

私はクエリーセットをループして解決することを考えていましたが、そのユーザーがその本との関係を持っているかどうかを確認しましたが、これはn + 1と呼ばれています。だから、もっと良い解決策があるのだろうか?

答えて

2

これは、2つのクエリに加えて、少しの処理を行うことができます。まず、すべての本を手に入れてください。そのユーザーのBookRelationsをすべて取得します。次に、書籍を関係に関連付けるために繰り返します。

books = Book.objects.all() 
user_relations = BookRelation.objects.filter(user=my_user) 
# now create a dict of relations keyed by book id: 
book_relations = dict((r.book_id, r) for r in user_relations) 
# now annotate the books with relations if they exist: 
for book in books: 
    book.relation = book_relations.get(book.id) 

それが存在する場合は今すぐクエリセット内の各本は、そのユーザ/本のためBookRelationあるrelation属性を持っています。

+0

これは本当に感謝しました。私はbook_relationsが一意ではないので、それを調整しなければならなかった。 – Pickels

関連する問題