Django 模型(model)類的查詢集和過濾器

2021-10-02 10:10:40 字數 2114 閱讀 5552

在控制器上呼叫方法返回查詢集(queryset)。

查詢經過過濾器篩選後返回新的查詢集,所以可以寫成鏈式呼叫

queryset支援鏈式查詢

author.objects.

filter

(name__contains=

"weizhongtu").

filter

(email=

"[email protected]"

)author.objects.

filter

(name__contains=

"wei"

).exclude(email=

"[email protected]"

)# 找出名稱含有abc, 但是排除年齡是23歲的

person.objects.

filter

(name__contains=

"abc"

).exclude(age=

23)

方法

說明all()

返回所有資料

filter()

返回符合條件的資料

exclude()

過濾掉符合條件的資料

order_by()

排序values()

一條資料就是乙個字典,返回乙個列表

get()

返回乙個滿足條件的物件

如果沒有找到符合條件的物件,會引發模型類.doesnotexist異常

如果找到多個,會引發模型類.multiobjectsreturned異常

first()

返回查詢集的第乙個物件。隱藏bug:可能會出現first、last獲取到的是相同的物件。

last()

返回查詢集的最後乙個物件。隱藏bug:可能會出現first、last獲取到的是相同的物件。

count()

返回當前查詢集的個數

exist()

判斷查詢集中是否有資料,有資料返回true,否則返回false

隱藏bug的解決辦法:

限制查詢集,可以使用切片操作。等同於sql中的limitoffset

切片區間:左閉右開django切片的索引不能是負數,否則會報錯。

person.objects.

all()[

:10] 切片操作,前10條

person.objects.

all()[

-10:] 會報錯!!!

# 1. 使用 reverse() 解決

person.objects.

all(

).reverse()[

:2]# 最後兩條

person.objects.

all(

).reverse()[

0]# 最後一條

# 2. 使用 order_by,在欄目名(column name)前加乙個負號

author.objects.order_by(

'-id')[

:20]# id最大的20條

來自

sql查詢語句中的 limit 與 offset 的區別:

limit y 分句表示: 讀取 y 條資料

limit x, y 分句表示: 跳過 x 條資料,讀取 y 條資料

limit y offset x 分句表示: 跳過 x 條資料,讀取 y 條資料

查詢集的快取:每乙個查詢集都包含乙個快取,來最小化對資料庫的訪問

在新建的查詢集中,快取首次為空,第一次對查詢集求值,會發生資料快取,並返回查詢結構,以後的查詢直接使用查詢集的快取。

我們在寫filter()、exclude()、all()都不會真正去查資料庫,只有我們在迭代結果集,或者獲取單個物件屬性時,它才會查詢資料庫。

這種查詢方式也叫懶查詢,為了優化結構和查詢。

Django 2 1 3 模型層 Model類

完本文件涵蓋了該model類的功能。有關模型的更多資訊,請參閱模型參考指南的完整列表。每個非抽象model類都必須新增乙個 manager例項。django確保在您的模型類中至少指定了乙個預設的manager。如果你不新增自己的manager,django將新增乙個包含預設 manager例項的ob...

Django的模型類Meta

一懟 什麼是海盜精神?就是做自己喜歡做的事,哪怕它反抗了君主,我生而為狼,也像狼一樣死去。這就是海盜精神。在模型類中定義meta類來修改表名 class department models.model 部門類 name models.charfield max length 20 create da...

Django模型類定義

資料庫表名 可通過db table指明資料庫表名。關於主鍵 django會為表建立自動增長的主鍵列,每個模型只能有乙個主鍵列,如果使用選項設定某屬性為主鍵列後django不會再建立自動增長的主鍵列。預設建立的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。屬性命名限制 字段型別...