1. 程式人生 > 實用技巧 >orm 正向查詢 反向查詢

orm 正向查詢 反向查詢

基於物件的跨表查詢 -- 類似於子查詢

正向查詢和反向查詢

關係屬性(欄位)寫在哪個類(表)裡面,從當前類(表)的資料去查詢它關聯類(表)的資料叫做正向查詢,反之叫做反向查詢

 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) #444
8 # #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----------------------------------->AuthorDetail
17 <----------------------------------- 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 '''

基於雙下劃綫的跨表查詢 -- 連表 join

正向查詢和反向查詢

 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}