.Tang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

聚合操作就是对数据库的数值类型操作的方法

avg,sum,max,min,count

select avg(age) from students  # 求年龄平均值

 

 django中的聚合操作

1.aggregate:返回QuerySet对象 ,聚合操作的结果返回一个字典

Table.object.all().aggregate(Count(字段))

class ModelStudy(View):
    '''
    聚合操作只能在QuerySet对象操作
    Table.object.all(), Table.object.filter(age__gte=18) __gte大于等于18
    总之是多个数据的QuerySet集合
   aggregate(Max('age'),Min('age')) 多个聚合操作
''' def get(self, request): ''' QuerySet.aggregate(Sum("字段名")) ''' print Students.objects.all().aggregate(Max('age')) print Students.objects.aggregate(Max("age")) # 可简写 比对上面 等同 .all().aggregate print Students.objects.filter(age__gte=18).aggregate(Count("age")) # 大于等于 print Students.objects.filter(age__lt=18).aggregate(Max("age")) # 小于
    
     # Count可以去重统计 ,参数 distinct=True
     print Students.object.aggregate(Count("age", distinct=True)) # 返回结果为 {u'age_avg': 3} age_avg是默认的名字,可以自己指定名字 name=Count('age')
     print Students.object.aggregate(new_name=Count("age")) # {'new_name': 4} 
return HttpResponse("ojbk")

 2.annotate 集合查询 。 可以做分组统计   

Table.object.values('字段').annotate(Count('字段'))

Table.object.values_list('字段').annotate(Count('字段'))

annotate的聚合结果是针对每行数据,而不是整个查询结果

class ModelStudy(View):

    def get(self, request):
        print Students.objects.values("age")
        print Students.objects.values("age").annotate(Count('age'))
        print Students.objects.values_list("age").annotate(Count('age'))

        return HttpResponse("ojbk")

>>> <QuerySet [{u'age': 20L}, {u'age': 28L}, {u'age': 21L}, {u'age': 10L}, {u'age': 10L}]>
>>> <QuerySet [{u'age': 20L, u'age__count': 1}, {u'age': 28L, u'age__count': 1}, {u'age': 21L, u'age__count': 1}, {u'age': 10L, u'age__count': 2}]>
>>> <QuerySet [(20L, 1), (28L, 1), (21L, 1), (10L, 2)]>

 

SQL语句:SELECT age,COUNT(age) FROM class_students GROUP BY age

 

posted on 2018-05-10 10:42  .Tang  阅读(640)  评论(0编辑  收藏  举报