2014-01-16 35 views
0

我正在寻找一个解决方案来过滤和订购我的模型的外键的外键。django筛选和订购查询中的foreign-foreignkey

比方说,我有:

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

我没有找到一个简单的方法来做到这一点在视图中注释查询,但由于这篇文章(django regroup and than dictsort by list length),我找到了一种丰富我的目标的方法。

这里是解决方案:

从popular_songbooks_list我在第一篇文章显示,我用的是重新组合的标签模板与自定义过滤器,然后切片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 

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