向查询集添加值

0 投票
1 回答
1414 浏览
提问于 2025-04-16 20:27

我这个问题的标题其实不太准确,但我不知道该怎么说。

我有一组书籍的数据。

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,如果存在的话。

撰写回答