令人惊讶的是我找不到通过查询建立群组的方法。
我有一个查询集qs
,我正在尝试按some_prop.val
分组,考虑qs
排除some_prop
为None
的条目。
我们说价值是[1, 2, 3]
,那么我会在这样的结果之后:
{1: entries1, 2: entries2, 3: entries3}
Django ORM是否提供任何功能来对这样的结果进行分组?
答案 0 :(得分:11)
没有特定的Django ORM方式(据我所知)但您可以执行以下操作来获取按字段值分组的条目字典:
使用.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
的条目。
<小时/>
将此留在此处以留下遗产原因。
我已经创建了Q&A style example,它模拟了COUNT ... GROUP BY
SQL查询。
基本上,您需要使用.order_by
进行分组,并使用.annotate()
依靠模型.values()
。
以下是上述例子:
我们可以在Django ORM上执行
COUNT ... GROUP BY
SQL等效查询,使用annotate()
,values()
,order_by()
和django.db.models
Count
方法:让我们的模型成为:
class Books(models.Model): title = models.CharField() author = models.CharField()
让我们假设我们想要计算Book表中每个不同作者有多少书籍对象:
result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))
现在结果包含一个包含两列的查询集:author和count:
author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...