django过滤并在查询中命令foreign-foreignkey

时间:2014-01-16 11:57:14

标签: django django-models

我正在寻找一种解决方案来过滤和订购我的模型的外键的外键。

让我说我有:

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位主要作者,但我没有找到该怎么做。是否有使用查询的解决方案或我是否必须在查询列表上进行后处理?

1 个答案:

答案 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

我不确定这是最好的解决方案,但它有效!