我想实现以下目标:
我有一个对象,让我们假设以下类:
class A():
title
class B():
foreign key = A.id
time
#one-to-many relation
我想知道如果要显示如下列表,视图和模板会是什么样:
A.Title1
B.time #A is sorted on these ones
B.time
A.Title2
B.time #A is sorted on these ones
B.time
B.time
其中与一个B()
对象关联的每组A()
对象按B.time
排序,而A()
对象本身按顶部B.time
排序在这些A()
对象中。
我将如何实现?
谢谢!
编辑:
我尝试了威廉·范·昂森(Willem van Onsen)的解决方案,但它导致了以下结果:
我要显示的对象:
实际显示的对象:
答案 0 :(得分:0)
在这种情况下,您可以执行表演,例如itertools.groupby
:
# views.py
from itertools import groupby
from operator import attrgetter
from django.db.models import Min
def some_view(request):
bs = B.objects.prefetch_related(
'foreign_key'
).annotate(
first_b=Min('foreign_key__b__time')
).order_by('first_b', 'time')
groups = groupby(bs, key=attrgetter('foreign_key'))
return render(request, 'some_template.html', {'groups': groups})
然后作为模板(some_template.html
),我们可以使用:
<ul>
{% for group, items in groups %}
<li>{{ group.title }}</li>
<ul>
{% for item in items %}
<li>{{ item.time }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>