在控制器上呼叫方法返回查詢集(queryset
)。
查詢經過過濾器篩選後返回新的查詢集,所以可以寫成鏈式呼叫
。
queryset支援鏈式查詢
author.objects.
filter
(name__contains=
"weizhongtu").
filter
(email=
)author.objects.
filter
(name__contains=
"wei"
).exclude(email=
)# 找出名稱含有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中的limit
、offset
。
切片區間:左閉右開。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。屬性命名限制 字段型別...