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