下面继续介绍数据库的一些应用:
Values获取字典形式的结果。
ret=Person2.objects.values('name','age')
结果如下,可以看到类型其实还是QuerySet还不是字典的形式
可以先将类型转成List的形式。
ret=list(Person2.objects.values('name','age'))[0]
Values_list获取元组形式结果
Annotate进行聚合,计数,平均数,求和等
首先我们来看下有多少个对象:
定义查询所有的函数:
def show_all(request):
info_dict={} all=Person2.objects.all() for a in all: info_dict[a.name]=a.age return render(request,'index.html',{'all_info':info_dict})
反馈如下:可以看到有3个对象,年龄分别是32,20,30
下面首先来计算人物的个数:
首先引入模块:django.db.models里面包含所有的计算函数
from django.db.models import *def inquery_by_annotate(request): ret=Person2.objects.all().values('name').annotate(count=Count('name')).values('name','count') return render(request,'index.html',{'ret':ret})上面的代码统计每个名字出现的次数。Annotate代表以某个元素进行聚类的意思。这里是以每个名字的次数进行聚类。返回结果如下。可以看到出现的次数都是1
假设我们建立多个名字叫zhf的人但是年龄不一样。那么看下得到的结果是什么。如下建立了3个名字叫zhf的,但是年龄分别是30,28,30
再次查询得到如下结果:可以看到zhf的count变成了3
我们还可以通过聚类求平均,如下:
ret=Person2.objects.all().values('name').annotate(avg=Avg('age')).values('name','avg')
单看这个函数比较难以理解,我们来看下对应的sql代码是多少:
ret=Person2.objects.all().values('name').annotate(avg=Avg('age')).values('name','avg').query从下面的sql就比较明确了。从person2中根据name进行分组,然后求出平均年龄