###########基于双下划线的跨表查询(基于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)