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)的主要内容,如果未能解决你的问题,请参考以下文章
在 django 中,我想在已经排序的查询集中获取特定元素及其几个邻居