【问题标题】:Django GROUP BY field valueDjango GROUP BY 字段值
【发布时间】:2017-12-23 02:47:13
【问题描述】:

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

我有一个查询集 qs,我正在尝试按 some_prop.val 分组,考虑到 qs 不包括 some_propNone 的条目。

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

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

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

【问题讨论】:

  • 如果您能发布更多关于您尝试过的查询的信息,我们会很乐意回答。

标签: python django


【解决方案1】:

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

  1. 使用.values_list()flat=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_value 字典包含interesting_field 中的不同值作为键,查询集对象作为值,每个都包含MyModelinteresting_field=a value from value_list 的条目。




出于评论遗留原因将其留在这里。

我做了一个Q&A style example in,它模拟了一个COUNT ... GROUP BY SQL 查询。

基本上您需要使用.order_by 进行分组,并使用.annotate() 来依赖模型的.values()

这是上面提到的例子:

我们可以在 Django ORM 上执行 COUNT ... GROUP BY 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
------------|-------  
 OneAuthor  |   5 
OtherAuthor |   2    
   ...      |  ...

【讨论】:

  • 是的,但我不想按count分组,我说得很清楚我想按values分组,我怎么能更清楚呢?我什至包括了预期的输出。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2015-09-12
  • 2011-05-25
  • 2017-07-15
相关资源
最近更新 更多