Django - 通过一些过滤的外键对象

时间:2015-06-24 04:08:33

标签: django django-templates

假设我有一个嵌套类别的博客。

我正在显示它们:

{% for category in categories %}
   <h1> {{category.title}} </h1>
   {% for subcategory in category.subcategories %}
      <h1> {{subcategory.title}} </h1>
   {% endfor %}
{% endfor %}

我需要通过一些已发布的帖子对类别及其子类别进行排序。

我该怎么做?

也许我可以在模型中使用Meta类中的排序,但我不知道是否可以通过许多过滤的外键来排序。我也不想在模型中这样做,因为我不想总是按顺序排序。

或许我可以编写某种模板标签来对相关项进行排序,看起来很方便,但我不知道如何。

或许还有其他一些更好的方法?

更新:

我创建了一个过滤器,按帖子数量对类别进行排序:

@register.filter
def sortbyposts(categories):
    categories = categories.annotate(number_of_posts=Count('posts')).order_by('-number_of_posts')
    return categories

我可以像这样使用它:

{% for category in categories|sortbyposts %}
   <h1> {{category.title}} </h1>
   {% for subcategory in category.subcategories|sortbyposts %}
      <h1> {{subcategory.title}} </h1>
   {% endfor %}
{% endfor %}

但现在我需要通过过滤的帖子来计算Count()。我能这样做吗?

1 个答案:

答案 0 :(得分:0)

我的解决方案:

创建模板标签:

@register.filter
def sortbypostcount(children):
    children_postcount = []
    for child in children:
        child.postcount = child.posts.filter(published=True,rational=False).count()
        children_postcount.append(child)

    children_postcount.sort(key=lambda x: x.postcount, reverse = True)

    return children_postcount

用它来对结果进行排序:

{% for category in categories|sortbypostcount %}
   <h1> {{category.title}} </h1>
   {% for subcategory in category.subcategories|sortbypostcount %}
      <h1> {{subcategory.title}} </h1>
   {% endfor %}
{% endfor %}