分组查询-->统计内容
annotate 控制器调用,query set调用
annotate 统计分组内容
分组条件 values('publish_id') 统计分组内容 annotate(a = Avg('price'))
publishs 和 publish_id 都可以作为分组条件
values 写在 annotate 的前边 表示分组条件 annotate 里边写统计内容
方式一: 可以多字段分组
ret = models.Book.objects.values('publishs_id','id').annotate(a = Avg('price'))
方式二: 连表查询,据第一张表的id 查 ,ORM中 ,别名a必须写
ret = models.Publish.objects.annotate(a = Avg('book__price'))
ret 是Query set 集合 里边是model对象
ret = models.Publish.objects.annotate(a = Avg('book__price')).values('id','a')
group by 后面的 having ---> filter
F查询 自己表里字段比较 支持四则运算
1.表里的字段 批量操作
ret = models.Book.objects.filter(good__gt=F('comment'))
2.自己表里的字段 作比较
ret = models.Book.objects.update(price = F('price')+20)
Q查询 表示 |或 ~取反 & and
1.自己表中表示或,and,取反
ret = models.Book.objects.filter(Q(good=100)|Q(comment=99))
2.支持嵌套
Q可以互相嵌套,但必须用Q包裹起来
3.AND条件 普通条件必须写在Q条件后面
4.优先级 () > & >|
5.Q查询用符号连接起来,跟普通查询不是一个层次
orm支持原生sql
ret = models.BOOK.objects.raw('select * from app01_book;')
ret --> raw queryset 通过那个表调用,只能操作这个表
for i in ret:
print(i.title)
直接执行自定义sql
from django.db.models import connect,connections
cursor =connection.cursor() //cursor = connections['default'].cursor()
cursor.execute('select * from book where id =%s',[1]) 传参
ret = cursor.fetchone()
查看原生sql语句
print(connection.queries)
练习题
#查询每个作者的姓名以及出版的书的最高价格
# ret = models.Author.objects.annotate(a=Max('book__price')).values('name','a')
#查询作者id大于2作者的姓名以及出版社所出版的书的最高价格
ret = models.Author.objects.filter(id__gt=2).annotate(a =Max('book__price')).values('name','a')
print(ret)