带有分页和分组的 Django ListView

Posted

技术标签:

【中文标题】带有分页和分组的 Django ListView【英文标题】:Django ListView with pagination and grouping 【发布时间】:2014-11-29 20:03:15 【问题描述】:

假设我有 2 个模型:ArtistAlbum(专辑与 Artist 具有外键关系)...现在我想使用分页的ListView 显示所有专辑,但我想按艺术家分组显示它们。我知道 django 提供了一个强大的标签:regroup ...但是如果我对结果进行分页,我当然不能使用它,因为可能尚未从数据库中检索到一些艺术家专辑...所以我的问题是:我怎样才能使用 Django 的 ORM 完成这个?

目标是打印如下内容:

Artist 1
- album 1
- album 2
- album 3

Artist 2
- album 1
- album 2

...

【问题讨论】:

所以您想显示专辑 - 按艺术家分组,但不显示艺术家姓名?您希望如何对结果进行排序?按艺术家姓名,按专辑名称?一张专辑只有一位艺术家吗? 我当然也想显示艺人姓名,一张专辑只有一个艺人 【参考方案1】:

在您的模板中,您可以获取该艺术家的相关专辑:

<ul>
% for artist in object_list %
   <li>  artist 
   <ul>
   % for album in artist.album_set.all %
       <li> album </li>
   % endfor %
   </ul>
   </li>
% endfor %
</ul>

【讨论】:

但这会触发对每个艺术家的查询...我想避免多次查询 您可以通过在 ListView 中执行 select_related 来避免这种情况 不,我解决了...我必须使用prefetch_related,因为我使用的是反比关系!查询是: Artist.objects.prefetch_related('albums') ...无论如何感谢您的帮助,我会将您的答案标记为已接受;)

以上是关于带有分页和分组的 Django ListView的主要内容,如果未能解决你的问题,请参考以下文章

具有分页和分组的表格

Django的分页和中间件

Django-分页和中间件

Django - 分页和排序列表

django 中的高效分页和数据库查询

DAY18-Django之分页和中间件