1.正向查詢 --> 意思是從含有外鍵表查詢其外鍵對應的表的字段值 --> 正向查詢容易推導 (1)查詢書籍是三國演義的出版社郵箱 book_obj = models.Book.objects.filter(title='三國演義').first() 結果:123.qq.com (2)查詢書籍是 活着 的做者的姓名 book_obj = models.Book.objects.filter(title='活着').first() # print(book_obj.authors) # app01.Author.None 表示查詢的數據有多個,需加上all() print(book_obj.authors.all()) 結果:<QuerySet [<Author: 做者對象的名字:jason>]> (3)查詢做者爲jason電話號碼 user_obj = models.Author.objects.filter(name='jason').first() print(user_obj.authordetail.phone) 結果:1110
2.反向查詢 --> 從外鍵不在本表開始查詢對應關係表的數據 --> 相對要麻煩一點 (1)查詢出版社是南方出版社出版的書籍 一對多字段的反向查詢 # 首先要肯定的是,書籍與南方出版社是有關係的,可是外鍵在書籍那邊, # 從出版社開始查詢數據,先獲得出版社對象,在使用固定語法跨表到book表中,最後拿到數據。 publish_obj = models.Publish.objects.filter(name='南方出版社').first() print(publish_obj.book_set) # app01.Book.None print(publish_obj.book_set.all()) (2)查詢做者jason寫過的全部的書 多對多字段的反向查詢 author_obj = models.Author.objects.filter(name='jason').first() print(author_obj.book_set) # app01.Book.None print(author_obj.book_set.all()) (3)查詢做者電話號碼是110的做者姓名 一對一字段的反向查詢 authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first() print(authordetail_obj.author.name)
1.正向查詢 (1) 查詢書籍爲三國演義的出版社地址 res = models.Book.objects.filter(title='三國演義').values('publish__addr','title') (2) 查詢書籍爲活着的做者的姓名 res = models.Book.objects.filter(title='活着').values("authors__name",'title') (3)查詢做者爲jason的家鄉 res = models.Author.objects.filter(name='jason').values('authordetail__addr')
2.反向查詢 (1)查詢南方出版社出版的書名 res = models.Publish.objects.filter(name='南方出版社').values('book__title') (2)查詢電話號碼爲120的做者姓名 res = models.AuthorDetail.objects.filter(phone=120).values('author__name') (3)查詢做者爲jason的寫的書的名字 res = models.Author.objects.filter(name='jason').values('book__title') (4)查詢書籍爲三國演義的做者的電話號碼 res = models.Book.objects.filter(title='三國演義').values('authors__authordetail__phone')
(1)查詢jason做者的手機號 # 正向查詢 res = models.Author.objects.filter(name='jason').values('authordetail__phone') # 反向查詢 res = models.AuthorDetail.objects.filter(author__name='jason').values('phone') (2)查詢出版社爲東方出版社的全部圖書的名字和價格 # 正向查詢 res = models.Publish.objects.filter(name='東方出版社').values('book__title','book__price') # 反向查詢 res = models.Book.objects.filter(publish__name='東方出版社').values('title','price') (3)查詢東方出版社出版的價格大於400的書 # 正向查詢 res = models.Publish.objects.filter(name="東方出版社",book__price__gt=400).values('book__title','book__price') # 反向查詢 res = models.Book.objects.filter(price__gt=400,publish__name='東方出版社').values('title','price')
1.須要先導包 from django.db.models import Max,Min,Count,Sum,Avg 2.例子 (1)查詢全部書籍的做者個數 res = models.Book.objects.filter(pk=3).aggregate(count_num=Count('authors')) (2)查詢全部出版社出版的書的平均價格 res = models.Publish.objects.aggregate(avg_price=Avg('book__price')) (3)統計東方出版社出版的書籍的個數 res = models.Publish.objects.filter(name='東方出版社').aggregate(count_num=Count('book__id'))
1.例子 (1)統計每一個出版社出版的書的平均價格 res = models.Publish.objects.annotate( avg_price=Avg('book__price')).values('name','avg_price') (2)統計每一本書的做者個數 res = models.Book.objects.annotate( count_num=Count('authors')).values('title','count_num') (3)統計出每一個出版社賣的最便宜的書的價格 res = models.Publish.objects.annotate( min_price=Min('book__price')).values('name','min_price') (4)查詢每一個做者出的書的總價格 res = models.Author.objects.annotate( sum_price=Sum('book__price')).values('name','sum_price')