19. Django_ORM_數據查詢

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爲13的地址

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))  # 查詢200011號以後發佈的書籍

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: 項目哈哈>]>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章