###########基于双下划线的跨表查询(基于join实现的)#############
key: 正向查询按字段,反向查询按表名小写
1.查询python这本书出版社的名字
ret = Book.objects.filter(title="python").values("publish__name")
print(ret)
ret = Publish.objects.filter(book__title="python").values("name")
print(ret)
2 查询苹果出版社出版的所有的书籍的名称
ret = Publish.objects.filter(name="苹果出版社").values("book__title")
print(ret)
ret = Book.objects.filter(publish__name="苹果出版社").values("title")
print(ret)
3 查询python这本书籍的作者的年龄
ret = Book.objects.filter(title="python").values("authors__age")
print(ret)
ret = Author.objects.filter(book__title="python").values("age")
print(ret)
4 查询alex出版过的所有的书籍名称
ret = Author.objects.filter(name="alex").values("book__title")
print(ret)
ret = Book.objects.filter(authors__name="alex").values("title")
print(ret)
5 查询alex的手机号
ret = Author.objects.filter(name="alex").values("ad__tel")
print(ret)
ret = AuthorDetail.objects.filter(author__name="alex").values("tel")
print(ret)
6 查询手机号为123的作者的名字
ret = AuthorDetail.objects.filter(tel=123).values("author__name")
print(ret)
ret = Author.objects.filter(ad__tel=123).values("name")
print(ret)
########## 连续跨表 ###############
查询苹果出版社出版过的所有书籍的名字以及作者的姓名
ret = Publish.objects.filter(name="苹果出版社").values("book__title","book__authors__name")
print(ret)
ret = Book.objects.filter(publish__name="苹果出版社").values("title","authors__name")
print(ret)
手机号以123开头的作者出版过的所有书籍名称以及出版社名称
ret = AuthorDetail.objects.filter(tel__startswith=123).values("author__book__title","author__book__authors__name")
print(ret)
ret = Author.objects.filter(ad__tel__startswith=123).values("book__title","book__publish__name")
print(ret)
############### 聚合 分组 ################
查询所有书籍的平均价格
ret = Book.objects.aggregate(ang_price=Avg("price"))
print(ret)
查询所有书籍的个数
ret = Book.objects.aggregate(c=Count(1))
print(ret)
分组
单表分组查询
查询书籍表每一个出版社id以及对应的书籍个数
key: annotate()前values哪一个字段就按哪一个字段group by
ret = Book.objects.annotate(c=Count(1)).values("publish__nid","c")
print(ret)
查询每一个部门的名称以及对应员工的平均薪水
ret = Emp.objects.values("dep").annotate(avg_salary=Avg("salary"))
print(ret)
查询每一个省份的名称以及对应的员工最大年龄
ret = Emp.objects.values("pro").annotate(max_age=Max("age"))
print(ret)
###单表按主键分组没有意义
跨表分组查询
查询每一个出版社的名称以及对应的书籍平均价格
ret = Publish.objects.annotate(avg_price=Avg("book__price")).values("name","avg_price")
print(ret)
查询每一个作者的名字以及出版的书籍的最高价格
ret = Author.objects.annotate(max_price=Max("book__price")).values("name","max_price")
print(ret)
查询每一个书籍的名称以及对应的作者的个数
ret = Book.objects.annotate(c=Count("authors__pk")).values("title","c")
print(ret)
4 查询作者数不止一个的书籍名称以及作者个数
ret = Book.objects.annotate(c=Count("authors__pk")).filter(c__gt=1).values("title","c")
print(ret)
5 根据一本图书作者数量的多少对查询集 QuerySet进行排序
ret = Book.objects.annotate(c=Count("authors__pk")).order_by("c")
print(ret)
6 统计每一本以py开头的书籍的名称以及作者个数
ret = Book.objects.filter(title__startswith="py").annotate(c=Count("authors__pk")).values("title","c")
print(ret)
############### F 与 Q ################
查询评论数大于100的所有的书籍名称
ret = Book.objects.filter(comment_count__gt=100).values("title")
print(ret)
查询评论数大于2倍点赞数的所有的书籍名称
ret = Book.objects.filter(comment_count__gt=F("poll_count")*2)
print(ret)
给每一本书籍的价格提升100
Book.objects.update(price=F("price")+100)
查询价格大于300或者评论数大于3000的书籍
ret = Book.objects.filter(Q(price__gt=300)|Q(comment_count__gt=3000))
print(ret)