object======是模型屬性—用於模型對象和數據庫交互
一、查詢集QuerySet
什麼是查詢集?
查詢集:從數據庫查詢得到的模型對象集合QuerySet,是一個列表
什麼是過濾器?
過濾器:基於查詢集得到的結果上進一步進行條件篩選過濾結果
二、過濾器
1. 返回list/多個結果的過濾器
- values = model名稱.objects.all()
:返回所有數據;
等價:獲取所有數據,對應SQL:select * from User
1. 返回查詢集QuerySet對象。
from projects.models import Projects
Projects.objects.all()
Out[3]: <QuerySet [<Projects: 項目1>, <Projects: 項目2>, <Projects: 項目哈哈>, <Projects: 項目哈哈1>]>
2. 因爲是列表,所以其結果可以使 用values[索引].字段名獲取數據。
q = Projects.objects.all()
q[0].name
Out[5]: '項目1'
q[1].tester
Out[6]: '小靜2'
注意不支持負索引
q[-1].tester
Traceback (most recent call last):
File "C:\softwore\Python\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-7-177669c5e868>", line 1, in <module>
q[-1].tester
File "C:\softwore\Python\lib\site-packages\django\db\models\query.py", line 288, in __getitem__
"Negative indexing is not supported."
AssertionError: Negative indexing is not supported.
3. 可以進行切片操作
q[1:3]
Out[11]: <QuerySet [<Projects: 項目2>, <Projects: 項目哈哈>]>
q[:3]
Out[12]: <QuerySet [<Projects: 項目1>, <Projects: 項目2>, <Projects: 項目哈哈>]>
4. 可以進行遍歷操作:
for i in q:
print(i)
項目1
項目2
項目哈哈
項目哈哈1
- model名稱.objects.filter()
:返回滿足條件的數據
#等價sql:select * from tb_projects where leader = '測試經理'
Projects.objects.filter(leader="測試經理")
Out[14]: <QuerySet [<Projects: 項目哈哈>, <Projects: 項目哈哈1>]>
- model名稱.objects.exclude()
:返回滿足條件之外的數據
#等價sql:select * from tb_projects where leader != '測試經理'
Projects.objects.exclude(leader="測試經理")
Out[15]: <QuerySet [<Projects: 項目1>, <Projects: 項目2>]>
- model名稱.objects.order_by()
:返回排序後的結果
2. 返回一個特定對象的過濾器
- model名稱.objects.get()
:返回一個model類,而不是str
Projects.objects.get(id=1)
Out[16]: <Projects: 項目1>
1.如果查詢不到對應的結果, 則會拋出模型類.DoesNotExist異常
2.如果返回多條結果,則會拋出模型類.MultipleObjectsReturned異常
model名稱.objects.count()
:返回滿足查詢結果的總條數
# 等價sql:select count(*) from tb_projects
Projects.objects.count()
Out[23]: 4
-
model名稱.objects.aggregate()
:返回集合 -
model名稱.objects.exists()
:判斷返回的查詢集中是否有數據,沒有則False,有則True
Projects.objects.exists()
Out[28]: True
PS.
1.過濾器往往會和查詢條件結合使用進行查詢
2.一般情況用 model名稱.objects,但也會指定對象,比如說polls.address.
查詢集的特點
非立刻執行
1.創建查詢集時,並不會訪問數據庫。而是直到模板中調用到數據時,纔會進行數據庫的訪問。
緩存
1.查詢集的結果會被保存下來,再次查詢相同的數據時,會使用之前保存下來的結果數據
2.每個查詢集都會有一個緩存空間來保存查詢結果數據
3.切片和索引操作沒有緩存可用,每次都會實際去執行sql語句
3. 使用特定過濾方法:
1. 包含過濾:
模型類屬性名(字段名)__contains將包含指定字符串的所有記錄包含
__icontains不區分大小寫
Projects.objects.filter(leader__contains="測試經理a")
Out[30]: <QuerySet [<Projects: 項目哈哈>]>
Projects.objects.filter(leader__icontains="測試經理a")
Out[31]: <QuerySet [<Projects: 項目哈哈>, <Projects: 項目哈哈1>]>
2. 以xx開頭或者結尾過濾:
Projects.objects.filter(leader__startswith="測試")
Out[33]: <QuerySet [<Projects: 項目哈哈>, <Projects: 項目哈哈1>]>
Projects.objects.filter(leader__endswith="a")
Out[34]: <QuerySet [<Projects: 項目哈哈>]>
3.獲取查詢集的第一個元素以及最後一個元素:first()、last()
4.isnull:是否爲null
AddressInfo.objects.filter(pid__isnull = true) # 查詢pid爲null的地址
5.in:包含在範圍內
AddressInfo.address.filter(id__in = [1,3]) # 查詢id爲1或3的地址
6.gt、gte、lt、lte:大於、大於等於、小於、小
7.exclude:條件以外的數據
AddressInfo.objects.filter(id__exclude = 1) # 查詢id不爲1的地址
8.year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行查詢
BookInfo.objects.filter(pub_time__year = 2000) # 查詢2000年發表的書籍
9.datetime.date
from datetime import date
books = BookInfo.objects.filter(pub_time__gt = date(2000,1,1)) # 查詢2000年1月1號以後發佈的書籍
10.多條件查詢:或(使用|隔開查詢條件)
BookInfo.objects.filter(id__gt = 1 | pub_time__year = 2000) # 查詢id大於1或發佈年份是2000年的數據
11.多條件查詢:與(使用,隔開查詢條件)
BookInfo.objects.filter(id__gt = 1 , pub_time__year = 2000) # 查詢id大於1,並且發佈年份是2000年的數據
12.鏈式查詢:多個filter()進行查詢(其它過濾器也可以這樣)
BookInfo.objects.filter(id__gt = 1).filter(pub_time__year = 2000)
# 在查詢id大於1的結果集上,再查詢發佈`年份是2000年的
13.獲取查詢集的第一個元素以及最後一個元素:first()、last()
BookInfo.objects.filter(id__gt = 1).first()
BookInfo.objects.filter(id__gt = 1).last()
14.排序order_by(‘字段/-字段’)
- 字段名稱前面添加
-
代表從大到小排序 - 多個字段排序時候逗號隔開;
BookInfo.objects.filter(id__gt = 1).order_by('name') # 結果按照name排序,ascall碼從小到大
BookInfo.objects.filter(id__gt = 1).order_by('-name') # 結果按照name排序,ascall碼從大到小
BookInfo.objects.filter(id__gt = 1).order_by('id', 'name') # 結果先按照id排序,如果相同,則按照name排序
PS.
1.exact、contains、startswith、endswith這幾個運算符都區分大小寫,如需不區分大小寫,只需要在前面加上i即可:iexact、icontains、istartswitch、iendswith
外鍵關聯查詢:
Projects.objects.filter(interfaces__name='登錄接口')
Out[6]: <QuerySet [<Projects: 項目1>]>
Q查詢:
#多個條件逗號分開爲與的關係
Projects.objects.filter(leader="靜靜",tester="小靜")
Out[7]: <QuerySet [<Projects: 項目1>]>
#使用Q和|變爲或查詢
from django.db.models import Q
Projects.objects.filter(Q(leader="靜靜") |Q(tester="靜啊"))
Out[11]: <QuerySet [<Projects: 項目1>, <Projects: 項目2>, <Projects: 項目哈哈>]>