我正在寻找一种解决方案来过滤和订购我的模型的外键的外键。
让我说我有:
class Song(models.Model):
author = models.CharField(max_length=200,null=False)
class Songbook(models.Model):
songs = models.ManyToManyField(Song)
我已经能够感谢注释按歌曲数量排序我的歌集查询:
context['popular_songbooks_list'] = Songbook.objects.annotate(
favoritesongbook_count=Count('favoritesongbook')).order_by('-favoritesongbook_count')[:10]
现在,我想只显示每本歌集中包含的3位主要作者,但我没有找到该怎么做。是否有使用查询的解决方案或我是否必须在查询列表上进行后处理?
答案 0 :(得分:0)
我没有通过注释查询在视图中找到一种简单的方法,但是由于这篇文章(django regroup and than dictsort by list length),我找到了一种方法来丰富我的目标。
以下是解决方案:
从我在第一篇文章中展示的popular_songbooks_list中,我使用模板中的regroup标签和自定义过滤器,然后切片到3。
{% regroup songbook.songs.all by author as author_list %}
{% for author in author_list|groups_sort_reversed|slice:":3" %}
{{ author.grouper }}
{% endfor %}
自定义标记:
@register.filter()
def groups_sort_reversed(groups):
groups.sort(key=lambda group: len(group['list']), reverse=True)
return groups
我不确定这是最好的解决方案,但它有效!