令人惊讶的是,我找不到一种通过查询进行分组的方法。
我有一个查询集qs,我试图通过组some_prop.val,考虑qs被排除的条目,其中some_prop是None。
qs
some_prop.val
some_prop
None
假设值是[1, 2, 3],那么我将是这样的结果:
[1, 2, 3]
{1: entries1, 2: entries2, 3: entries3}
Django ORM是否提供任何功能来对结果进行分组?
(据我所知)没有特定的Django ORM方式,但是您可以执行以下操作以按字段值分组的条目字典:
使用.values_list()withflat=True获取数据库中现有值的列表(如果您事先不知道它们的话)。也.distinct()可以消除重复的值,因为我们不在乎那些值:
.values_list()
flat=True
.distinct()
value_list = MyModel.objects.values_list( 'interesting_field', flat=True
).distinct()
现在遍历value_list并填充您的字典:
value_list
group_by_value = {}
for value in value_list: group_by_value[value] = MyModel.objects.filter(interesting_field=value)
现在,group_by_valuedictionary包含您中的不同值interesting_field和queryset对象的值作为键,每个值都包含MyModelwith的条目interesting_field=a value from value_list。
group_by_value
interesting_field
MyModel
interesting_field=a value from value_list
出于评论遗留原因,将其留在此处。
我在其中提出了一个Q&A样式示例,该示例模拟了COUNT ... GROUP BYSQL查询。
COUNT ... GROUP BY
本质上,您需要利用.order_by进行分组和.annotate()依靠模型的.values()。
.order_by
.annotate()
.values()
这是上述示例:
我们可以执行COUNT ... GROUP BY对Django的ORM 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 ... | ...
我们可以执行COUNT ... GROUP BY对Django的ORM SQL等效查询,与使用annotate(),values(),order_by()和 django.db.models的Count方法:
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 ... | ...