4

我正在寻找类似以下的内容:

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

group_by()不存在...

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

这个聚合 API似乎可以让你为计数和总和做这样的事情,但我不需要计数或总和或任何东西,我实际上想要发票对象!

4

2 回答 2

2

有一个2007 年的页面将它入侵到 django,但这没有实际意义,因为 1.1 之前的版本确实有一个未记录的 group_by`。但是一年前的这个帖子似乎有一些见解。本质上:

Django 故意不在 ORM 中公开“GROUP BY”或类似的东西。尽管我们在关系存储后端上的事实有时会泄漏,但 ORM API 与 SQL 完全无关。取而代之的是,我们公开了一些特定的功能,这些功能恰好在变成 SQL 时使用“GROUP BY”实现(并且很可能由具有不同存储系统后端的一些完全不同的魔法精灵来实现)。

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

于 2010-03-13T14:20:31.473 回答
2

选项1:

尽管 Django 中不存在 a ,但您也可以尝试使用方法和用户过滤器来group_by()检索每个用户最近关闭的发票:latest()

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

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

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

选项 2:

更新:从那时起,我在这里添加了一个问答样式示例:如何在 Django ORM 中执行 GROUP BY ... COUNT 或 SUM?这显示了如何GROUP BY在 Django ORM 上模拟操作。

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

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

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

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

现在group_by_value字典包含你的不同值作为键interesting_field和查询集对象的值,每个都包含MyModelwith的条目interesting_field=a value from value_list


笔记:

存在这个库django-group-by,它声称group_by()在 Django 上添加一个你可能想要检查的。

于 2017-08-07T13:20:11.763 回答