Django查询使用Group By获取最后一条记录

Django查询使用Group By获取最后一条记录,django,group-by,sql-order-by,django-queryset,Django,Group By,Sql Order By,Django Queryset,我正在尝试根据id获取所有最近的记录,按月份排序 这是我的最后一张唱片 qs = Cashflow.objects.filter ( acct_id = a.id ).order_by('-month')[:1] 这就对账户进行了分组 qs = Cashflow.objects .filter ( acct_id = a.id ) .values ( 'acct_id' ) .annotate ( count = Count ( 'acct_id' ) )

我正在尝试根据id获取所有最近的记录,按月份排序

这是我的最后一张唱片

qs = Cashflow.objects.filter ( acct_id = a.id ).order_by('-month')[:1]
这就对账户进行了分组

qs = Cashflow.objects 
     .filter ( acct_id = a.id )
     .values ( 'acct_id' ) 
     .annotate ( count = Count ( 'acct_id' ) ) 
     .values ( 'acct_id', 'count' ) 
     .order_by ( ) 
如何将这两个查询合并为一个查询

按帐户id分组,按“月”排序并获取最后一条记录

这可能吗?谢谢

编辑:

这是我正在尝试做的sql版本

    select * 
    from cashflow t
    inner join (
        select acct_id, max ( `month` ) as MaxDate
        from cashflow
          where acct_id  IN ( 1,2,3,... )
        group by acct_id
    ) tm on t.acct_id = tm.acct_id and t.month = tm.MaxDate
    order  by acct_id 
这可以在纯Django中完成吗?我应该只做一个原始查询吗

干杯。

改为
。按('-month')[:1]订购。
最好使用或(或/表示日期)

当然,分组时,您可以使用
order\u by

last_record = Cashflow.objects \
    .values('acct_id') \
    .annotate(count=Count('id')) \
    .order_by('month') \
    .last() 

我在网上找到的最佳解决方案

“”
给定一个模型,其中包含:
category=models.CharField(最大长度=32,选项=category\u选项)
pubdate=models.DateTimeField(默认值为datetime.now)
从每个类别中获取具有最新发布日期的项目。
''' 
model_max_set=model.objects.values('category')。注释(max_pubdate=max('pubdate'))。order_by()
q_语句=q()
对于型号\u最大\u集合中的配对:
q|u语句|=(q(category|u exact=pair['category'])和q(pubdate=pair['max|u pubdate']))
model\u set=model.objects.filter(q\u语句)

通常最好解释一个解决方案,而不是仅仅发布几行匿名代码。“你可以阅读,也可以。”谢谢你的评论,我补充了一个解释。好多了+谢谢你的努力。这只给了我一个记录。@AntonShurashov你的回答是错的。它不会只返回最后一个帐户id。很抱歉,更有效的解决方案是使用Window SQL函数,甚至是我理解的postgres的
distinct
语句。用户询问使用Django ORM的问题。我认为我们不应该给出-1的正确答案。我同意这不是最有效的。但是如果我们对每一个无效的答案都加-1,那么我们就不会有很多问题的答案。但我也尊重你的回答。
'''
given a Model with:

   category    = models.CharField(max_length=32, choices=CATEGORY_CHOICES)
   pubdate     = models.DateTimeField(default=datetime.now)
   <other fields>

Fetch the item from each category with the latest pubdate.

''' 

model_max_set = Model.objects.values('category').annotate(max_pubdate=Max('pubdate')).order_by()

q_statement = Q()
for pair in model_max_set:
    q_statement |= (Q(category__exact=pair['category']) & Q(pubdate=pair['max_pubdate']))

model_set = Model.objects.filter(q_statement)