orm多表查询基于双下划线

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

 

posted @ 2018-10-26 20:09  被嫌弃的胖子  阅读(235)  评论(0编辑  收藏  举报