Django-如何通过关联对象排序列表中第一项的属性对对象进行排序?

时间:2018-07-05 19:31:22

标签: python django sorting one-to-many

我想实现以下目标:

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

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

1 个答案:

答案 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>