Django告诉双重排序中的某个属性的最后一项(order_by)

时间:2017-12-19 18:16:27

标签: python django python-3.x django-models django-templates

在Django查询集中,如何判断我所在的列表项(迭代时)是否是具有特定属性的列表项。

示例:我通过以下方式订购查询集:

  MyModel.objects.all().order_by('-featured', '-created_at')

所以,所有在适当的时间首先出现的对象,然后是按时间排序的所有非特色项目。

在模板中迭代时,我希望能够判断我是否按下了双顺序中的最后一个“特色”项目(例如feature = True)。

用法示例:如果是最后一项 - >显示横幅分隔特色/非特色 - >继续迭代显示横幅后的非特色。

{% for object in object_list %}
    # display object
    {% if last item with attribute %} 
          # display banner
    {% endif %}
{% endfor %}

我知道我可以使用另一个查询集来获取计数,但这是我想要避免的额外查询。

1 个答案:

答案 0 :(得分:2)

在将查询集中的项目传递给模板之前,可以使用itertools.groupby对项目进行分组。然后,当组密钥从True更改为False时,您将显示横幅广告:

from itertools import groupby

qs = MyModel.objects.all().order_by('-featured', '-created_at')
grouped_qs = groupby(qs, lambda x: x.featured)

然后在你的模板中:

{% for k, g in grouped_qs %}
   {% if not k %}
       <!- show banner -->
   {% endif %}

   {% for model_obj in g %}
       <!- do something with model_obj -->
   {% endfor %}
{% endfor %}