原生SQL:select avg(price) from book group by publish_id;
orm中的分组
统计每个出版社出版的书籍的平均价格
ret=models.Book.objects.values('publishs_id').annotate(a=Avg('price'))
ret=models.Publish.objects.annotate(a=Avg('book__price')).values('a')
F查询与Q查询
F查询:自己单单里面的字段比较
from django.db.models import F,Q
# 点赞数大于评论数
models.Book.objects.filter(good__gt=F('comment'))
# 点赞数大于评论数+20
models.Book.objects.filter(good__gt=F('comment')+20)
# 让表里的字段price都加20
models.Book.objects.all().update(price=F('price')+20)
Q查询:结合filter函数 和_gt lt等下划线方法一同使用
# 评论数 点赞数都大于80的
models.Book.objects.filter(good__gt=80,comment__gt=80)
# 评论数大于等于80 或 点赞数大于等于80的
models.Book.objects.filter(Q(good_gte=80)|Q(good_gte=80))
orm执行原生SQL语句
models.Publish.objects.raw('select * from app01_publish;') # <RawQuerySet: select * from app01_book>
直接执行自定义的SQL语句
from django.db import connection,connections
cursor = connection.cursor()
cursor.execute(sql,[1,])
cursor.fetchall()
展示SQL
from django.db import connection
print(connection.queries)
orm练习
查询每个作者的姓名以及出版的书的最高价格
ret = models.Author.objects.annotate(a=Max('book__price')).values('name','a')
查询作者id大于2或者作者年龄大于等于20岁的女作者的姓名以及出版的书的最高价格
ret = models.Author.objects.filter(Q(id__gt=2)|Q(age__gtq=20,sex='female')).annotate(a=Max('book__price')).values('name','a')
查询每个作者出版的书的最高价格的平均值
ret = models.Author.objects.annotate(a=Max('book__price')).aggregate(Avg('a'))
原文:https://www.cnblogs.com/he-qing-qing/p/11245471.html