Django:分组?

时间:2010-03-13 01:43:58

标签: python django group-by django-orm

我正在寻找以下内容:

previous_invoices = Invoice.objects.filter(is_open=False)
                                   .order_by('-created')
                                   .group_by('user')

group_by()不存在......

这将为每个用户找到最近关闭的发票。

这个aggregation API似乎让你做了这样的事情来计算和数额,但我不需要计算或总和或任何东西,我实际上想要发票对象!

2 个答案:

答案 0 :(得分:2)

this page from 2007将其攻击到django,但这样做没有实际意义,因为1.1之前确实有一个无证件的group_by`。但this thread from a year ago似乎有一些见解。基本上:

  

Django故意不公开“GROUP BY”或类似的东西   ORM。虽然事实我们是   在关系存储后端   有时会漏掉ORM API   与SQL无关。相反,我们   暴露特定的碎片   功能恰好是   当它是使用“GROUP BY”时实现的   变成了SQL(很可能是   由一些完全不同的人实施   一套神奇的仙女与   不同的存储系统后端)。

另请参阅使用extra的提及,以及 可能失败的神奇方式。祝你好运。

答案 1 :(得分:1)

选项1:

虽然Django中不存在group_by(),但您可以尝试使用latest()方法为每个用户检索最近关闭的发票,并为用户进行过滤:

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
                                   .latest('created') 

对于旧版本的Django,latest()不存在,查询将如下所示:

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False)
                                   .order_by('-created')[0]

选项2:

如果你绝对想要创建group_by的效果,那么你可以手动创建一个效果,如接受的答案所示:Django GROUP BY field value

  
      
  1. 使用.values_list()flat=True获取数据库中现有值的列表(如果您事先不知道它们)。同时使用.distinct()来消除重复值,因为我们不关心这些:

    value_list = MyModel.objects.values_list(
        'interesting_field', flat=True
    ).distinct()
    
  2.   
  3. 现在遍历value_list并填写您的词典:

    group_by_value = {}
    for value in value_list:
        group_by_value[value] = MyModel.objects.filter(interesting_field=value)
    
  4.         

    现在group_by_value字典包含不同值的键   在interesting_field中,以及每个查询集对象的值   包含MyModelinteresting_field=a value from value_list的条目。

注意:

存在此库django-group-by,声称可以在Django上添加group_by(),您可能需要检查。