ORM多表操作--分组,F查询,Q查询,原生语句查询

分组查询-->统计内容

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)

 

上一篇:django-数据库的增删改查操作


下一篇:orm操作