Django GROUP BY字段值

时间:2017-07-18 09:54:27

标签: python django

令人惊讶的是我找不到通过查询建立群组的方法。

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

我们说价值是[1, 2, 3],那么我会在这样的结果之后:

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

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

1 个答案:

答案 0 :(得分:11)

没有特定的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)
    
  3. 现在group_by_value字典包含interesting_field中不同值的关键字以及查询集对象的值,每个对象都包含MyModelinteresting_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    
       ...      |  ...