Django Упорядочить по «related_name» после фильтрации последней записи - PullRequest
0 голосов
/ 17 ноября 2018

Вот так выглядит пример модели

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 name

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 голосов
/ 17 ноября 2018

Вы можете аннотировать Макс. из timestamp с набором запросов и порядком по ним. Итак, попробуйте так:

from django.db.models import Max

Foo.objects.annotate(max_t = Max('get_bars__timestamp')).order_by('max_t')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...