向查询集添加值
我这个问题的标题其实不太准确,但我不知道该怎么说。
我有一组书籍的数据。
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的问题?所以我在想有没有更好的解决办法?
1 个回答
2
你可以通过两个查询来完成这个任务,再加上一点处理。首先,获取所有的书籍;然后,获取该用户的所有书籍关系;接着,遍历这些关系,把书籍和关系关联起来。
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
,如果存在的话。