Django: получить строку на основе максимального значения значения поля внешнего ключа - PullRequest
2 голосов
/ 06 ноября 2011

У меня есть две модели

class Status(models.Model)
    name = models.CharField(max_length=25)
    rank = models.PositiveSmallIntegerField()

class MyModel(models.Model)
    user = models.ForeignKey(User)
    category = models.CharField(max_length=2)
    status = models.ForeignKey(Status)
    entry_date = models.DateField()

--- Status table ---
id   |   name     |   rank 
1    |   poor     |   1
2    |   below avg|   2
3    |   avg      |   3
4    |   above avg|   4
5    |   good     |   5


--- MyModel table ---
user   |  category | status_id | entry_date
user1  |  A        | 1         | ..
user1  |  A        | 2         | ..
user1  |  A        | 3         | ..
user1  |  B        | 2         | ..

Для данного пользователя я хочу получить статус максимального рейтинга для каждой категории.Так что для user1 мне нужны следующие две строки

user   |  category | status_id | entry_date
user1  |  A        | 3         | ..
user1  |  B        | 2         | ..

Как мне этого добиться?Я попытался MyModel.objects.annotate(max_rank=Max('status__rank')).filter(status__rank=F('max_rank')), но он выбрасывает «Неизвестный столбец myapp_status.rank» в «имеющем предложение».

1 Ответ

2 голосов
/ 06 ноября 2011

, так как вы хотите группировать по пользователю и категории, я думаю, вам нужно что-то вроде

 MyModel.objects.values('user', 'category' 
     ).annotate(max_rank=Max('status__rank'))

, поскольку может быть несколько записей с максимальным рангом, я не думаю, что вы можете получить entry_dateиз запроса агрегации, подобного этому

См. документы для получения дополнительной информации

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