Django:根据外键字段值的最大值获取行

时间:2011-11-06 09:24:27

标签: django django-queryset

我有两个型号

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')) 但它会在'having clause'中抛出“未知列'myapp_status.rank'。”

1 个答案:

答案 0 :(得分:1)

因为你想按用户和类别分组,我认为你需要像

这样的东西
 MyModel.objects.values('user', 'category' 
     ).annotate(max_rank=Max('status__rank'))

因为可能有几个条目具有最高排名,我认为你不能从像这样的聚合查询中获得entry_date

有关详情,请参阅the docs