在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 %}
我知道我可以使用另一个查询集来获取计数,但这是我想要避免的额外查询。
答案 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 %}