Django告诉双重排序中具有特定属性的最后一项(order_by)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django告诉双重排序中具有特定属性的最后一项(order_by)相关的知识,希望对你有一定的参考价值。

在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 %}

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

答案

您可以使用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 %}

以上是关于Django告诉双重排序中具有特定属性的最后一项(order_by)的主要内容,如果未能解决你的问题,请参考以下文章

如何让 heapq 评估特定属性的堆?

在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居

Django - 如何从模板中的查询集中获取最后一项

如何在 Django 模板中引用列表中的最后一项? list.-1.key

Django模型:禁止具有特定值的状态

Django - 如何排除表单字段视图?