查詢集:表示從數據庫獲取的對象集合,查詢集能夠有多個過濾器,過濾器就是一個函數(方法),基於所給參數限制查詢集結果
從sql角度來講,查詢集和select等價,過濾器和where等價sql
查詢集特色:數據庫
惰性執行:建立查詢集不會帶來任何的數據訪問,直到調用數據(要用滴時候)時,纔會訪問數據django
直接訪問數據的狀況(直接向數據庫拿):迭代/序列化/與if合用緩存
返回查詢集的方法稱爲過濾器函數
過濾器方法:spa
返回一堆數據的過濾器:code
all() | 返回查詢集中全部的對象(有啥返回啥) |
filter() | 返回符合條件的數據值對象 格式:.filter(鍵=值)blog .filter(鍵=值,鍵=值)排序 .filter(鍵=值).filter(鍵=值) |
exclude() | 過濾掉符合條件的數據值 |
order_by() | 排序 |
values() | 返回查詢集中具體的數據值(一個列表,其中一條數據就是一個對象) |
返回單個數據的過濾器:
get() | 返回一個知足條件的對象 注:若沒有找到符合條件的對象,會引起模型類DoesNotExist異常 若找到多個對象,會引起模型類MultipleObjectReturned異常 |
count() | 返回當前查詢集的對象個數 |
first() | 返回查詢集的第一個對象 |
last() | 返回查詢集的最後一個對象 |
exists() | 判斷查詢集中是否有數據,如有數據返回True |
限制查詢集:查詢集返回列表,能夠使用下標的方法進行限制,等同於sql中的limit語句
注:下標不能是負數
舉個栗子:
顯示前5條:studentList=Students.stuObj1.all()[0:5]
分頁顯示:studentList=Students.stuObj1.all()[(page-1)*5:page*5]
查詢集的緩存:每一個查詢集都包含一個緩存來最小化的對數據庫進行訪問
在新建的查詢集中,緩存首次爲空,第一次對查詢集求值,會發生數據緩存,
django會將查詢出來的數據作一個緩存,並返回查詢結構,之後的查詢直接使用查詢集的緩存
字段查詢:
概述:實現類sql中where語句,做爲方法filter(),exclude(),get()的參數
語法:屬性名稱__比較運算符 = 值
外鍵:屬性名_id
比較運算符:
exact | exact:判斷(大小寫敏感,在前面加上i, iexact就表示不區分大小寫) |
contains | 是否包含(大小寫敏感,在前面加上i,icontains就表示不區分大小寫)(例:studentsList = Students.stuObj1.filter(name__icontains="ni")) |
startswith/endswith | 以value開頭或結尾(大小寫敏感,在前面加上i,istartswith/iendswith就表示不區分大小寫)(例:.filter(name__istartswith="ni")) |
isnull/isnotnull | 是否爲空(例:.filter(name__isnull=True)) |
in | in:是否包含在範圍內(例:.filter(pk__in=[2,3,4,6,8])) (【pk】主鍵) |
gt/gte/lt/lte | 大於/大於等於/小於/小於等於(例:.filter(age__gt=30)) |
year/month/day/week_day/hour/minute/second | 匹配年/月/日....(例:.filter(lastTime__year=2017)) |
跨關聯查詢:
處理join查詢(鏈接查詢)
語法:模型類名__屬性名__(比較運算符)
舉個栗子:
grade = Grades.objects.filter(students__contend__contains='nili') # 模型類名__屬性名__比較運算符
# 帶有‘nili’這幾個字母的數據是屬於哪一個班級的 print(grade)
查詢快捷:
pk(主鍵)
聚合函數:使用aggregate()函數返回聚合函數的值
Avg | 平均值 |
Count | 計數 |
Max | 最大值 |
Min | 最小值 |
Sum | 求和 |
舉個栗子:
from django.db.models import Max def studentsearch(request): maxAge = Students.stuObj1.aggregate(Max('age')) print(maxAge)
F對象:
能夠使用模型的A屬性與B屬性進行比較,且支持F對象的算術運算
舉個栗子:
from django.db.models import F def grades(request): g = Grades.objects.filter(girl_num__gt=('boy_num')+20) print(g) return HttpResponse('....')
Q對象:
過濾器的方法中的關鍵字參數,進行or查詢就能夠使用Q對象
舉個栗子:
from django.db.models import F,Q def studentss(request): studentsList = Students.stuObj1.filter(Q(pk__lte=3)|Q(age__gt=50)) # 或 pk(主鍵) studentsList = Students.stuObj1.filter(Q(pk__lte=3)) # 只用於匹配 studentsList = Students.stuObj1.filter(~Q(pk__lte=3)) # 取反