Как получить последние из многих групп одновременно - PullRequest
8 голосов
/ 23 марта 2011

У меня есть такая модель:

class Foo(models.Model):
    date = models.DateTimeField()
    language = models.TextField()
    # other stuff

И я хочу сгруппировать Foo по языкам, а затем получить самый последний в каждой группе. Я не смог понять, как использовать QuerySet API django для этого (честно говоря, я тоже не знаю, как это сделать в SQL). Так, например:

pk | date   |    language
---+--------+------------------
1  | 1:00   |    python
2  | 1:30   |    python/django
3  | 1:45   |    haskell
4  | 2:15   |    python
5  | 2:45   |    haskell

Я хочу получить что-то похожее на этот результат:

{ 'python': 4, 'python/django': 2, 'haskell': 5 }

Где, возможно, вместо цифр это полные Foo объекты.

Ответы [ 2 ]

2 голосов
/ 05 января 2016

Вы можете использовать необработанный запрос для решения ваших проблем:

query = Foo.objects.raw('SELECT id, language, MAX(date) FROM sqltest_foo GROUP BY language;')
for foo in query:
    print foo.id, foo.language

Obs: я использую синтаксис SQLite, но другие языки SQL должны быть похожи.

0 голосов
/ 23 марта 2011

Попробуйте это:

Foo.objects.values ​​( 'язык'). Аннотацию (max_date = ( 'дата') Макс). Order_by ()

Или вам действительно нужен идентификатор записи с максимальной датой?

Возможно, вы захотите прочитать это: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...