orm 正向查詢 反向查詢
阿新 • • 發佈:2020-09-03
基於物件的跨表查詢 -- 類似於子查詢
正向查詢和反向查詢
關係屬性(欄位)寫在哪個類(表)裡面,從當前類(表)的資料去查詢它關聯類(表)的資料叫做正向查詢,反之叫做反向查詢
1 #查詢 2 # 一對一 3 # 正向查詢 4 #1 查詢崔老師的電話號 5 # author_obj = models.Author.objects.filter(name='崔老師').first() 6 # # print(author_obj.authorDetail) #遼寧峨眉山 7 # # print(author_obj.authorDetail.telephone) #4448 # #2 反向查詢 9 # #2 查詢一下這個444電話號是誰的. 10 # author_detail_obj = models.AuthorDetail.objects.get(telephone='444') 11 # print(author_detail_obj.author) #崔老師 12 # print(author_detail_obj.author.name) #崔老師 13 14 15 ''' 正向查詢:Authorobj.authorDetail,物件.關聯屬性名稱 16 Author----------------------------------->AuthorDetail17 <----------------------------------- 18 反向查詢:AuthorDetailobj.author ,物件.小寫類名 19 ''' 20 21 # 一對多 22 # 查詢一下李帥的床頭故事這本書的出版社是哪個 23 # 正向查詢 24 book_obj = models.Book.objects.get(title='李帥的床頭故事') 25 print(book_obj.publishs) #B哥出版社 26 print(book_obj.publishs.name) #B哥出版社 27 28 # B哥出版社出版社出版了哪些書 29 # 反向查詢 30 pub_obj = models.Publish.objects.get(name='B哥出版社') 31 print(pub_obj.book_set.all()) #<QuerySet [<Book: 李帥的床頭故事>, <Book: 李帥的床頭故事2>]> 32 33 ''' 正向查詢 book_obj.publishs 物件.屬性 34 Book ---------------------------------------------> Publish 35 <---------------------------------------------- 36 反向查詢 publish_obj.book_set.all() 物件.表名小寫_set 37 ''' 38 39 # 多對多 40 # 李帥的床頭故事這本書是誰寫的 41 # 正向查詢 42 book_obj = models.Book.objects.get(title='李帥的床頭故事') 43 print(book_obj.authors.all()) 44 # 高傑寫了哪些書 45 author_obj = models.Author.objects.get(name='高傑') 46 print(author_obj.book_set.all()) 47 48 ''' 正向查詢 book_obj.authors.all() 物件.屬性 49 Book ---------------------------------------------> Author 50 <---------------------------------------------- 51 反向查詢 author_obj.book_set.all() 物件.表名小寫_set 52 '''
正向查詢和反向查詢
1 #查詢 2 # 一對一 3 # 1. 查詢崔老師的電話號 4 # 方式1 正向查詢 5 # obj = models.Author.objects.filter(name='崔老師').values('authorDetail__telephone') 6 # print(obj) #<QuerySet [{'authorDetail__telephone': '444'}]> 7 # 方式2 反向查詢 8 # obj = models.AuthorDetail.objects.filter(author__name='崔老師').values('telephone','author__age') 9 # print(obj) #<QuerySet [{'telephone': '444'}]> 10 # 2. 哪個老師的電話是444 11 # 正向 12 # obj = models.Author.objects.filter(authorDetail__telephone='444').values('name') 13 # print(obj) 14 # 反向 15 # obj = models.AuthorDetail.objects.filter(telephone='444').values('author__name') 16 # print(obj) 17 18 # 一對多 19 # 查詢一下李帥的床頭故事這本書的出版社是哪個 20 # obj = models.Book.objects.filter(title='李帥的床頭故事').values('publishs__name') 21 # print(obj) #<QuerySet [{'publishs__name': 'B哥出版社'}]> 22 23 # obj = models.Publish.objects.filter(book__title='李帥的床頭故事').values('name') 24 # obj = models.Publish.objects.filter(xx__title='李帥的床頭故事').values('name') 25 # print(obj) 26 27 # B哥出版社出版社出版了哪些書 28 # obj = models.Publish.objects.filter(name='B哥出版社').values('book__title') 29 # print(obj) #<QuerySet [{'book__title': '李帥的床頭故事'}, {'book__title': '李帥的床頭故事2'}]> 30 31 # obj = models.Book.objects.filter(publishs__name='B哥出版社').values('title') 32 # print(obj) #<QuerySet [{'title': '李帥的床頭故事'}, {'title': '李帥的床頭故事2'}]> 33 34 # 李帥的床頭故事這本書是誰寫的 35 # obj = models.Book.objects.filter(title='李帥的床頭故事').values('authors__name') 36 # print(obj) 37 # obj = models.Author.objects.filter(book__title='李帥的床頭故事').values('name') 38 # print(obj) #<QuerySet [{'name': '高傑'}, {'name': '崔老師'}]> 39 40 #高傑寫了哪些書 41 # obj = models.Book.objects.filter(authors__name='高傑').values('title') 42 # print(obj) 43 # obj = models.Author.objects.filter(name='高傑').values('book__title') 44 # print(obj) 45 46 #進階的 47 # B哥出版社 出版的書的名稱以及作者的名字 48 # obj = models.Book.objects.filter(publishs__name='B哥出版社').values('title','authors__name') 49 # print(obj) 50 #<QuerySet [{'title': '李帥的床頭故事', 'authors__name': '高傑'}, {'title': '李帥的床頭故事', 'authors__name': '崔老師'}, {'title': '李帥的床頭故事2', 'authors__name': '崔老師'}, {'title': '李帥的床頭故事2', 'authors__name': '王濤'}]> 51 ''' 52 SELECT app01_book.title,app01_author.name from app01_publish INNER JOIN app01_book on app01_publish.id=app01_book.publishs_id 53 INNER JOIN app01_book_authors on app01_book.nid = app01_book_authors.book_id INNER JOIN app01_author 54 ON app01_author.id = app01_book_authors.author_id where app01_publish.name='B哥出版社'; 55 :param request: 56 :return: 57 ''' 58 59 # obj = models.Publish.objects.filter(name='B哥出版社').values('book__title','book__authors__name') 60 # print(obj) 61 62 # obj = models.Author.objects.filter(book__publishs__name='B哥出版社').values('name','book__title') 63 # print(obj) 64 65 # authorDetail author book publish 66 # 手機號以4開頭的作者出版過的所有書籍名稱以及出版社名稱 67 # ret = models.AuthorDetail.objects.filter(telephone__startswith='4').values('author__book__title','author__book__publishs__name') 68 # print(ret) 69 #QuerySet [{'author__book__title': '李帥的床頭故事', 'author__book__publishs__name': 'B哥出版社'}, {'author__book__title': '李帥的床頭故事2', 'author__book__publishs__name': 'B哥出版社'}]> 70 71 72 #查詢一下B哥出版社出版了哪些書 73 # obj = models.Publish.objects.filter(name='B哥出版社').first() 74 # print(obj.xx.all())
聚合
1 from django.db.models import Avg,Max,Min,Sum,Count 2 3 # 計算所有圖書的平均價格 4 # obj = models.Book.objects.all().aggregate(a=Avg('price'),m=Max('price')) #aggregate()是QuerySet 的一個終止子句,得到的是個字典. 5 # print(obj['m'] - 2) #{'price__avg': 2.833333}