Django—— 多表操做之基於對象的跨表查詢(正反向查),基於雙下劃線的跨表查詢,進階連續跨表查詢

1、基於對象的跨表查詢(正向反向查詢)

# 跨表查詢有兩種方式
    -基於對象的跨表查詢:子查詢
    -基於雙下劃線的跨表查詢:關聯查詢,連表查詢
    
    
# 基於對象的跨表查詢
    -查詢主鍵爲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)

2、基於雙下劃線的跨表查詢

# 連表查詢
   # 基於對象的跨表查詢,先查對象,經過對象再去查另外一個對象(正向:字段名,反向:表名小寫/表名小寫_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)

3、進階連續跨表查詢

  # 連續跨表
    #查詢北京出版社出版過的全部書籍的名字以及做者的姓名
    # 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)
相關文章
相關標籤/搜索