【问题标题】:django filter and order foreign-foreignkey in a querydjango 在查询中过滤和排序外键
【发布时间】:2018-02-22 05:34:15
【问题描述】:

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

假设我有:

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 位主要作者,但我不知道该怎么做。有没有使用查询的解决方案,还是我必须对查询列表进行后处理?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我没有找到通过注释查询在视图中执行此操作的简单方法,但感谢这篇文章 (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
    

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

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 2018-03-04
      • 2013-09-17
      • 1970-01-01
      • 2023-03-11
      • 2020-10-22
      • 2016-07-01
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多