zoukankan      html  css  js  c++  java
  • Django—— 多表操作之基于对象的跨表查询(正反向查),基于双下划线的跨表查询,进阶连续跨表查询

    一、基于对象的跨表查询(正向反向查询)

    # 跨表查询有两种方式
        -基于对象的跨表查询:子查询
        -基于双下划线的跨表查询:关联查询,连表查询
        
        
    # 基于对象的跨表查询
        -查询主键为1的书籍的出版社所在的城市
        
        # 基于对象的跨表查询(子查询)
        # 一对多
        # 查询主键为1的书籍的出版社所在的城市
        # book=models.Book.objects.get(id=1) # 第一次查询
        # # book=models.Book.objects.filter(id=1).first()
        # publish=book.publish  # 内部又执行了一次查询,根据publish_id查询publish
        # print(publish.addr)
    
        # 北京出版社出版的所有书籍
        # publish=models.Publish.objects.get(name='北京出版社')  # 第一次查询了出版社
        # books=publish.book_set.all()    # 表名小写_set     # 第二次,根据出版社id,查询所有书
        # print(books)
    
        # 正向查询:book表内有publish字段 直接对象.字段名
        # 反向查询:publish表内没有book字段,出版社对象.Book小写_set.all()
    
    
        ### 一对一
        # 查询所有住址在山东的作者的姓名
        # 反向查询:author_detail没有author字段,author_detail.表名小写
        # author_detail=models.AuthorDetail.objects.filter(addr__contains='山东').first()
        # # 反向
        # print(author_detail.author.name)
    
        # 查询egon作者的地址
        # 正向
        # author=models.Author.objects.get(name='egon')
        # print(author.author_detail.addr)
    
    
        # 多对多关系查询
        #金梅所有作者的名字以及手机号
        # book=models.Book.objects.get(name='金梅')
        # # 正向
        # authors=book.authors.all()
        # for author in authors:
        #     print(author.name)
        #     print(author.author_detail.phone)
    
        # 反向 查询egon出过的所有书籍的名字
        # egon=models.Author.objects.get(name='egon')
        # books=egon.book_set.all()
        # for book in books:
        #     print(book.name)

    二、基于双下划线的跨表查询

    # 连表查询
       # 基于对象的跨表查询,先查对象,通过对象再去查另一个对象(正向:字段名,反向:表名小写/表名小写_set.all())
    
    
        # 地址为山东的作者写的所有书
        # author_detail=models.AuthorDetail.objects.get(addr='山东')
        # author=author_detail.author
        # books=author.book_set.all()
        # print(books[0].name)
    
        # (作业)地址为山东的作者写的所有书的出版社名字
    
    
        ### 基于双下划线的跨表查之  一对多
        # 正向:字段名
        # 反向:表名小写
        # filter,values,values_list(写 __ 跨表)
        # 练习:  查询北京出版社出版过的所有书籍的名字与价格(一对多)
        # SELECT `app01_book`.`name`, `app01_book`.`price` FROM `app01_publish` LEFT OUTER JOIN `app01_book` ON (`app01_publish`.`id` = `app01_book`.`publish_id`) WHERE `app01_publish`.`name` = '北京出版社' ;
        # res=models.Publish.objects.filter(name='北京出版社').values('book__name','book__price')
        # print(res)
        #SELECT `app01_book`.`name`, `app01_book`.`price` FROM `app01_book` INNER JOIN `app01_publish` ON (`app01_book`.`publish_id` = `app01_publish`.`id`) WHERE `app01_publish`.`name` = '北京出版社';
    
        # res=models.Book.objects.filter(publish__name='北京出版社').values('name','price')
        # print(res)
    
    
        ## 多对多
        # 练习: 查询egon出过的所有书籍的名字,价格(多对多)
        #反向
        # res=models.Author.objects.filter(name='egon').values('book__name','book__price')
        # print(res)
    
        # 正向
        # res=models.Book.objects.filter(authors__name='egon').values('name','price')
        # print(res)
    
        #查询egon的手机号
        # res=models.Author.objects.filter(name='egon').values('author_detail__phone')
        # print(res)
        # res=models.AuthorDetail.objects.filter(author__name='egon').values('phone')
        # print(res)

    三、进阶连续跨表查询

      # 连续跨表
        #查询北京出版社出版过的所有书籍的名字以及作者的姓名
        # res=models.Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name')
        # print(res)
    
        # res=models.Book.objects.filter(publish__name='北京出版社').values('name','authors__name')
        # print(res)
    
        # res=models.Author.objects.filter(book__publish__name='北京出版社').values('book__name','name')
        # print(res)
    
        # 手机号以189开头的作者出版过的所有  书籍名称  以及   出版社名称
        # res=models.AuthorDetail.objects.filter(phone__startswith='189').values('author__book__name','author__book__publish__name')
        # print(res)
    
        # SELECT `app01_book`.`name`, `app01_publish`.`name` FROM `app01_author` INNER JOIN `app01_authordetail` ON (`app01_author`.`author_detail_id` = `app01_authordetail`.`id`) LEFT OUTER JOIN `app01_book_authors` ON (`app01_author`.`id` = `app01_book_authors`.`author_id`) LEFT OUTER JOIN `app01_book` ON (`app01_book_authors`.`book_id` = `app01_book`.`id`) LEFT OUTER JOIN `app01_publish` ON (`app01_book`.`publish_id` = `app01_publish`.`id`) WHERE `app01_authordetail`.`phone` LIKE  '189%' ;
        res=models.Author.objects.filter(author_detail__phone__startswith='189').values('book__name','book__publish__name')
        print(res)
  • 相关阅读:
    win2003系统网络安装——基于linux+pxe+dhcp+tftp+samba+ris
    Linux系统网络安装——基于pxe+dhcp+nfs+tftp+kickstart
    写在前面
    windows下使用批处理设置环境变量
    使用广告终结者屏蔽页面的任意部分
    window7 输入什么命令可以快速打开服务管理?? 虚拟机设置了NAT网络连接方式,还是无法上网?
    [转]PHP100视频教程(2012-2013版)下载地址及密码
    窗口对象的方法 prompt() 用来输入数据
    HTML5 canvas标签绘制正三角形 鼠标按下点为中间点,鼠标抬起点为其中一个顶点
    javascript弹出框打印某个数值时,弹出NaN?(not a number)
  • 原文地址:https://www.cnblogs.com/guojieying/p/13813987.html
Copyright © 2011-2022 走看看