分组查询
-
原生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'))
-