Django GROUP BY字段值

dab*_*aba 6 python django

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

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

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

{1: entries1, 2: entries2, 3: entries3}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*fis 13

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

  1. 使用.values_list()with flat=True获取数据库中现有值的列表(如果您事先不知道它们).还用于.distinct()消除重复值,因为我们不关心这些:

    value_list = MyModel.objects.values_list(
        'interesting_field', flat=True
    ).distinct()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在迭代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.modelsCount方法:

让我们的模型是:

class Books(models.Model):
    title  = models.CharField()
    author = models.CharField()
Run Code Online (Sandbox Code Playgroud)

让我们假设我们想要计算Book表中每个不同作者有多少书对象:

result = Books.objects.values('author')
                      .order_by('author')
                      .annotate(count=Count('author'))
Run Code Online (Sandbox Code Playgroud)

现在结果包含一个包含两列的查询集:author和count:

  author    | count
------------|-------  
 OneAuthor  |   5 
OtherAuthor |   2    
   ...      |  ...
Run Code Online (Sandbox Code Playgroud)

  • 是的,但我不想按计数分组,我说得很清楚我想按**值**分组,我怎么能更清楚?我什至包括了预期的输出。 (2认同)