【问题标题】:Django - How to sort objects by an attribute of the first item in a sorted list of associated objects?Django - 如何通过关联对象的排序列表中第一项的属性对对象进行排序?
【发布时间】:2018-07-05 19:31:21
【问题描述】:

我想实现以下目标:

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

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

其中与一个A() 对象关联的每组B() 对象按B.time 排序,A() 对象本身按这些A() 对象中的顶部B.time 排序。

我将如何实现这一目标?

提前致谢!

编辑:

我尝试了 Willem van Onsen 的解决方案,但结果如下:
我要展示的对象:

实际显示的对象:

【问题讨论】:

  • 我是否可以对 `A()` 对象进行排序,例如:A.objects.select_all(B).order_by(B.objects.select_related('a').order_by('time')[0])

标签: python django sorting one-to-many


【解决方案1】:

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

【讨论】:

  • 差不多了,但我不想按标题排序 A,我想按每个 A 的前 B.time 排序它们
  • 您还需要通过A 的属性对它们进行排序,因为groupby 会以突发方式工作...
  • @NathanRuth:您可以做的是对 first 相关的B 对象上的As 进行排序,如果需要,请参阅更新。
  • 真的很接近,但现在我不仅需要显示第一个 B 对象。我想显示所有这些,但首先按最低日期对它们进行排序。
  • @NathanRuth:就是这样,我们只用第一个b注释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多