首页 > 解决方案 > Django - 如何通过关联对象的排序列表中第一项的属性对对象进行排序?

问题描述

我想实现以下目标:

我有一个对象,让我们假设以下类:

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 的解决方案,但它导致了以下结果:
我想要显示 的对象:实际显示的对象:
所有对象

显示的对象

标签: pythondjangosortingone-to-many

解决方案


在这种情况下,您可以执行 perform 例如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>

推荐阅读