我正在寻找以下内容:
previous_invoices = Invoice.objects.filter(is_open=False)
.order_by('-created')
.group_by('user')
但group_by()
不存在......
这将为每个用户找到最近关闭的发票。
这个aggregation API似乎让你做了这样的事情来计算和数额,但我不需要计算或总和或任何东西,我实际上想要发票对象!
答案 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。
使用
.values_list()
和flat=True
获取数据库中现有值的列表(如果您事先不知道它们)。同时使用.distinct()
来消除重复值,因为我们不关心这些:value_list = MyModel.objects.values_list( 'interesting_field', flat=True ).distinct()
- 醇>
现在遍历
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
中,以及每个查询集对象的值 包含MyModel
和interesting_field=a value from value_list
的条目。
注意:强>
存在此库django-group-by,声称可以在Django上添加group_by()
,您可能需要检查。