2011-06-28 46 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

你可以在兩個查詢中加上一點處理。首先,獲取所有書籍;然後,獲取用戶的所有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) 

現在每本書在查詢集有一個relation屬性,它是BookRelation該用戶/書,如果它存在。

+0

這真的幫助我感謝。我不得不調整它,因爲我的book_relations不是唯一的。 – Pickels