按每个组的最近日期获取第一个元素

时间:2016-10-25 13:51:57

标签: python sql django orm

我在django中有以下模型

Business ID
Business Name
Business Revenue
Date

以下是示例数据:

Business ID | Business Name | Business Revenue | Date
1             B1              1000               2012-10-13
2             B2              20000              2013-10-16
1             B1              2000               2013-04-13
2             B2              24000              2014-09-02

我想要获取所有拥有最新日期的商家。

这是我想要的输出:

Business ID | Business Name | Business Revenue | Date
1             B1              2000               2013-04-13
2             B2              24000              2014-09-02

我试过这个:

model.objects.filter(date__gte = date.today()).order_by('business_id', '-date')

这使我在每个小组中拥有最新业务的一组业务位于其顶部。如何省略其余行?我需要一些帮助

2 个答案:

答案 0 :(得分:1)

试试这个:

from django.db.models import Q

group_dict = Model.objects.values('business_id').annotate(max_date=Max('date')).order_by()

params = Q()
for obj in group_dict:
    params |= (Q(business_id__exact=obj['business_id']) & Q(date=obj['max_date']))

qs = Model.objects.filter(params)

link可以帮助你。

  

如果values()子句在annotate()子句之前,则为任何注释   将自动添加到结果集中。但是,如果   您需要在annotate()子句之后应用values()子句   明确包括聚合列。

答案 1 :(得分:0)

您可以使用order_by和distinct()方法

Model.objects.all().order_by('business_id', '-date').distinct('business_id')