2017-07-18 69 views
1

令人惊讶的是,我找不到通过查询创建组的方法。Django GROUP BY字段值

我有一个查询设置qs,我通过some_prop.val试图组,考虑qs被排除项,其中some_propNone

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

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

是否Django的ORM提供任何功能,以团体成绩也是这样吗?

+2

如果你可以发布更多关于您尝试的查询将有利于我们回答。 – Aniket

回答

3

没有具体的Django的ORM的方式(据我所知),但你可以做以下的话,被现场的值进行分组条目的词典:

  1. 使用.values_list()flat=True到获取数据库中现有值的列表(如果您事先不知道)。还可以使用.distinct()到elimintae重复的值,因为我们不为那些关心:

    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,它模拟了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() 

让我们假设我们要计算每个不同的作者很多书对象是如何在我们的书籍表存在:

result = Books.objects.values('author') 
         .order_by('author') 
         .annotate(count=Count('author')) 

现在结果包含查询集有两列:作者和计数:

author | count 
------------|------- 
OneAuthor | 5 
OtherAuthor | 2  
    ...  | ... 
+0

是的,但我不想数数组,我非常清楚地说我想按**值**分组,我怎么能更清楚?我甚至包括了预期的产出。 – dabadaba

+0

@dabadaba我做了一个修改,看看。 –