Django ORM分組查詢

2022-10-05 04:57:09 字數 1751 閱讀 2256

# 關鍵字:annotate()

# models後面(.)什麼就是按什麼分組

eg:models.book.objects.annotate() # 這裡就是按照書籍表每本書來分組

示例:

# 統計每本書的作者數量

res = models.book.objects.annotate(author_num=count('authors__id')).values('name','author_num')

print(res) # 按照書籍表分組,統計外來鍵字段對應作者表的id

# 簡寫

res1 = models.book.objects.annotate(author_num=count('authors')).values('name','author_num')

print(res1)

# author_num為我們自己定義的字段,用來儲存統計出來的每本書對應的作者個數

# 統計每個出版社賣的最便宜的書的**

res = models.publish.objects.annotate(book_price=min('book__price')).values('name','book__name','book_price')

print(res)

# 解析:先按出版社分組,然後再統計最便宜書的**就是用到min聚合查詢,反向查詢用表名的小寫book,然後要用到書表的**欄位book__price,再通過values方法查詢的對應的資料

# 統計不止乙個作者的圖書

res = models.book.objects.annotate(more_author=count('authors')).filter(more_author__gt=1).values('name','more_author')

print(res)

# 補充:只要orm語句得出的結果是乙個queryset物件,那麼它就可以繼續無限制的點queryset物件封裝的方法。

# 查詢每個作者出的書的總**

補充:

如果想按照指定的字段分組該如何處理呢?

# 找到指定的字段後在進行分組

例:models.book.objects.values('price').annotate()

注:如果在分組查詢報錯的情況,需要修改資料庫的嚴格模式。

django orm 查詢語句

model.objects.all 獲取所有物件的queryset model.objects.filter 獲取滿足條件的物件的queryset model.objects.exclude 獲取不滿足條件的物件的queryset model.objects.get 獲取單個符合條件的物件的quer...

Django ORM 查詢集介紹

django的orm中存在查詢集的概念。查詢集,也稱查詢結果集 queryset,表示從資料庫中獲取的物件集合。當呼叫如下過濾器方法時,django會返回查詢集 而不是簡單的列表 對查詢集可以再次呼叫過濾器進行過濾,如 bookinfo.objects.filter bread gt 30 orde...

動態分組查詢

示例資料 create table 表 id int,num int insert 表 select 1,2 union all select 2,3 union all select 3,2 union all select 4,2 union all select 5,12 union all ...