小编典典

Django GROUP BY字段值

python

令人惊讶的是,我找不到一种通过查询进行分组的方法。

我有一个查询集qs,我试图通过组some_prop.val,考虑qs被排除的条目,其中some_propNone

假设值是[1, 2, 3],那么我将是这样的结果:

{1: entries1, 2: entries2, 3: entries3}

Django ORM是否提供任何功能来对结果进行分组?


阅读 219

收藏
2021-01-20

共1个答案

小编典典

(据我所知)没有特定的Django ORM方式,但是您可以执行以下操作以按字段值分组的条目字典:

  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_valuedictionary包含您中的不同值interesting_field和queryset对象的值作为键,每个值都包含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.modelsCount方法:

让我们的模型为:

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  
   ...      |  ...
2021-01-20