需要帮助处理orm
请求。
有两张桌子。Author
和Book
(例如名称,所以您不需要查看逻辑(,通过FK
链接。
class Book(models.Models):
title = models.Charfield(...)
class Author(models.Model):
book = models.ForeignKey(Book)
需要按书对作者进行分组,并循环浏览。问题是如何只选择每本书的最后50位作者。
我可以写这个:
for book in Book.all()
for author in book.author_set.all()[:50]:
....
但这不是一个最佳解决方案。
错误的答案,我没有意识到切片意味着一个新的查询。我的坏,不要往下看。
要优化查询,您需要使用prefetch_related((方法:
预取延迟((返回QuerySet将在单个批次中自动检索相关对象对于每个指定的查找。
这与select_related的目的相似,因为两者都是旨在阻止由访问相关对象,但策略完全不同。
select_related通过创建SQL联接并包含字段来工作SELECT语句中相关对象的。由于这个原因,select_related获取同一数据库查询中的相关对象。然而,为了避免由于通过"多"关系加入,select_related仅限于单值关系-外键和一对一。
另一方面,prefetch_related对每个执行单独的查找关系,并在Python中执行"连接"。这允许它预取多对多和多对一对象,这是无法完成的除了外键和一对一之外,还使用select_relatedselect_related支持的关系。
for book in Book.all().prefetch_related()
for author in book.author_set.all()[:50]
您还需要订购您的book.author_set查询集,以确保获得最新的条目。