Django ORM 之基於對象、雙下劃線查詢

返回ORM目錄 Django ORM

內容目錄:

  1、 基於對象的表查詢
  2、 基於雙下劃線的查詢
  3、 聚合查詢 aggregate
  4、 分組查詢 annotate

1、 基於對象的表查詢

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)

2、 基於雙下劃線的查詢

 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')

3、聚合查詢 aggregate

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'))
​

4、分組查詢 annotate

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')
相關文章
相關標籤/搜索