令人惊讶的是我找不到通过查询建立组的方法.
我有一个查询集qs,我试图通过组some_prop.val,考虑qs被排除的条目,其中some_prop是None.
让我们说值是[1, 2, 3],然后我会在这样的结果之后:
{1: entries1, 2: entries2, 3: entries3}
Run Code Online (Sandbox Code Playgroud)
Django ORM是否提供任何功能来分组这样的结果?
Joh*_*fis 13
没有特定的Django ORM方式(据我所知),但您可以执行以下操作来获取按字段值分组的条目字典:
使用.values_list()with flat=True获取数据库中现有值的列表(如果您事先不知道它们).还用于.distinct()消除重复值,因为我们不关心这些:
value_list = MyModel.objects.values_list(
'interesting_field', flat=True
).distinct()
Run Code Online (Sandbox Code Playgroud)现在迭代value_list并填写你的字典:
group_by_value = {}
for value in value_list:
group_by_value[value] = MyModel.objects.filter(interesting_field=value)
Run Code Online (Sandbox Code Playgroud)现在,group_by_value字典包含作为键的不同值interesting_field,作为查询集对象的值和值,每个值包含MyModelwith 的条目interesting_field=a value from value_list.
离开这里是为了评论遗留原因.
我已经制作了一个Q&A样式示例,它模拟了一个COUNT ... GROUP BYSQL查询.
基本上你需要利用.order_by分组和.annotate()依靠模型.values().
这是上面提到的例子:
我们可以执行
COUNT ... GROUP BY对Django的ORM SQL等效查询,与使用annotate(),values(),order_by()和django.db.models的Count方法:让我们的模型是:
Run Code Online (Sandbox Code Playgroud)class Books(models.Model): title = models.CharField() author = models.CharField()让我们假设我们想要计算Book表中每个不同作者有多少书对象:
Run Code Online (Sandbox Code Playgroud)result = Books.objects.values('author') .order_by('author') .annotate(count=Count('author'))现在结果包含一个包含两列的查询集:author和count:
Run Code Online (Sandbox Code Playgroud)author | count ------------|------- OneAuthor | 5 OtherAuthor | 2 ... | ...
| 归档时间: |
|
| 查看次数: |
10966 次 |
| 最近记录: |