О!!! Нужно сделать свертку объектов!
from collections import defaultdict
_t_by_o2 = defaultdict(list)
for t in tt:
_t_by_o2[t.o].append=t
_o2_by_o1 = defaultdict(list)
for o2 in o22:
_o2_by_o1[o2.o1].append=o2
Теперь в шаблоне можно работать с хешами только по циклу o11 без ифов
{% for o1 in o11 %}
<span>{{o1.n}}</span>
{% for o2 in _o2_by_o1.get(o1,[]) %}
<span>{{ o2t.n}}</span>
{% for t in _t_by_o2.get(o2,[]) %}
<a href="/{{ t.u }}/">{{ t.n }}</a><span>({{ t.c }})</span>
{% endfor %}
{% endfor %}
{% endfor %}
Как-то так!
PS. Я вообще не понимаю, зачем такие дикие циклы и чем они обусловлены?! В браузере мы всё равно лимон объектов не отобразим. Значит их всего максимум сотня-другая, а если это так, то что-то не то в консерватории взаимосвязей, или пытаемся делать не там их обработку. Может быть задуматься, почему нам нужно эти объекты связывать при отображении и почему они до сих пор находятся в таком кошмаре?!