筛选最后一条记录后,Django在“ related_name”上排序

时间:2018-11-17 04:12:09

标签: django python-3.x django-models

这是示例模型的样子

models.py

class Foo(models.Model):
    name = models.CharField(max_length=16)

class Bar(models.Model):
    foo = models.ForeignKey(Foo, related_name="get_bars")
    name = models.CharField(max_length=16)
    timestamp = models.DateTimeField(auto_now_add=True)

样本数据

  

hello_foo

hello_foo

  

hello_bar

hello_bar

目标

在最后连接的foos记录中查找按timestamp排序的所有bar。 (foo以一对多关系连接到bar

我尝试过的事情

我知道如何根据foo过滤bar

foos = hello.models.Foo.objects.filter(get_bars__name="foo1-bar1")

我还可以根据foo的名字订购bar

foos = hello.models.Foo.objects.order_by("-get_bars__name")

但是我该如何使用它对foo的最后一个条记录执行排序?

示例纯SQL,我会这样写:

select foo.name, bar.last_ts
from hello_foo as foo 
    inner join 
    (select foo_id, max(timestamp) as last_ts from hello_bar group by foo_id) as bar
    on foo.id = bar.foo_id
order by bar.last_ts desc

我正在使用Django 1.11和python3

1 个答案:

答案 0 :(得分:2)

您可以使用查询集和顺序对timestamp的{​​{3}}进行注释。 因此,尝试这样:

from django.db.models import Max

Foo.objects.annotate(max_t = Max('get_bars__timestamp')).order_by('max_t')