### 簡介
* 查詢集表示從數據庫中獲取的對象集合
* 查詢集可以含有零個、一個或多個過濾器
* 過濾器基于所給的參數限制查詢的結果
* 從Sql的角度,查詢集和select語句等價,過濾器像where和limit子句
* 接下來主要討論如下知識點
* 查詢集
* 字段查詢:比較運算符,F對象,Q對象
* * * * *
### 查詢集
* 在管理器上調用過濾器方法會返回查詢集
* 查詢集經過過濾器篩選后返回新的查詢集,因此可以寫成鏈式過濾
* 惰性執行:創建查詢集不會帶來任何數據庫的訪問,直到調用數據時,才會訪問數據庫
* 何時對查詢集求值:迭代,序列化,與if合用
* 返回查詢集的方法,稱為過濾器
* all()
* filter()
* exclude()
* order_by()
* values():一個對象構成一個字典,然后構成一個列表返回
* 寫法:
~~~
filter(鍵1=值1,鍵2=值2)
等價于
filter(鍵1=值1).filter(鍵2=值2)
~~~
* 返回單個值的方法
* get():返回單個滿足條件的對象
* 如果未找到會引發"模型類.DoesNotExist"異常
* 如果多條被返回,會引發"模型類.MultipleObjectsReturned"異常
* count():返回當前查詢的總條數
* first():返回第一個對象
* last():返回最后一個對象
* exists():判斷查詢集中是否有數據,如果有則返回True
> 限制查詢集
>
* 每個查詢集都包含一個緩存來最小化對數據庫的訪問
* 在新建的查詢集中,緩存為空,首次對查詢集求值時,會發生數據庫查詢,django會將查詢的結果存在查詢集的緩存中,并返回請求的結果,接下來對查詢集求值將重用緩存的結果
* 情況一:這構成了兩個查詢集,無法重用緩存,每次查詢都會與數據庫進行一次交互,增加了數據庫的負載
~~~
print([e.title for e in Entry.objects.all()])
print([e.title for e in Entry.objects.all()])
~~~
* 情況二:兩次循環使用同一個查詢集,第二次使用緩存中的數據
~~~
querylist=Entry.objects.all()
print([e.title for e in querylist])
print([e.title for e in querylist])
~~~
* 何時查詢集不會被緩存:當只對查詢集的部分進行求值時會檢查緩存,但是如果這部分不在緩存中,那么接下來查詢返回的記錄將不會被緩存,這意味著使用索引來限制查詢集將不會填充緩存,如果這部分數據已經被緩存,則直接使用緩存中的數據
* * * * *
### 字段查詢
* 實現where子名,作為方法filter()、exclude()、get()的參數
* 語法:屬性名稱__比較運算符=值
* `__`表示兩個下劃線,左側是屬性名稱,右側是比較類型
* 對于外鍵,使用“屬性名_id”表示外鍵的原始值
* 轉義:like語句中使用了%與,匹配數據中的%與,在過濾器中直接寫,例如:filter(title__contains="%")=>where title like '%\%%',表示查找標題中包含%的
> 比較運算符
>
* exact:表示判等,大小寫敏感;如果沒有寫“ 比較運算符”,表示判等
~~~
filter(isDelete=False)
~~~
* contains:是否包含,大小寫敏感
~~~
exclude(btitle__contains='傳')
~~~
* startswith、endswith:以value開頭或結尾,大小寫敏感
~~~
exclude(btitle__endswith='傳')
~~~
* isnull、isnotnull:是否為null
~~~
filter(btitle__isnull=False)
~~~
* 在前面加個i表示不區分大小寫,如iexact、icontains、istarswith、iendswith
* in:是否包含在范圍內
~~~
filter(pk__in=[1, 2, 3, 4, 5])
~~~
* gt、gte、lt、lte:大于、大于等于、小于、小于等于
~~~
filter(id__gt=3)
~~~
* year、month、day、week_day、hour、minute、second:對日期間類型的屬性進行運算
~~~
filter(bpub_date__year=1980)
filter(bpub_date__gt=date(1980, 12, 31))
~~~
* 跨關聯關系的查詢:處理join查詢
* 語法:模型類名 <屬性名> <比較>
* 注:可以沒有__<比較>部分,表示等于,結果同inner join
* 可返向使用,即在關聯的兩個模型中都可以使用
~~~
filter(heroinfo_ _hcontent_ _contains='八')
~~~
* 查詢的快捷方式:pk,pk表示primary key,默認的主鍵是id
~~~
filter(pk__lt=6)
~~~
> 聚合函數
* 使用aggregate()函數返回聚合函數的值
* 函數:Avg,Count,Max,Min,Sum
~~~
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
~~~
* count的一般用法:
~~~
count = list.count()
~~~
> F對象
>
* 可以使用模型的字段A與字段B進行比較,如果A寫在了等號的左邊,則B出現在等號的右邊,需要通過F對象構造
~~~
list.filter(bread__gte=F('bcommet'))
~~~
* django支持對F()對象使用算數運算
~~~
list.filter(bread__gte=F('bcommet') * 2)
~~~
* F()對象中還可以寫作“模型類__列名”進行關聯查詢
~~~
list.filter(isDelete=F('heroinfo__isDelete'))
~~~
* 對于date/time字段,可與timedelta()進行運算
~~~
list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))
~~~
> Q對象
>
* 過濾器的方法中關鍵字參數查詢,會合并為And進行
* 需要進行or查詢,使用Q()對象
* Q對象(django.db.models.Q)用于封裝一組關鍵字參數,這些關鍵字參數與“比較運算符”中的相同
~~~
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
~~~
* Q對象可以使用&(and)、|(or)操作符組合起來
* 當操作符應用在兩個Q對象時,會產生一個新的Q對象
~~~
list.filter(pk_ _lt=6).filter(bcommet_ _gt=10)
list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10))
~~~
* 使用~(not)操作符在Q對象前表示取反
~~~
list.filter(~Q(pk__lt=6))
~~~
* 可以使用&|~結合括號進行分組,構造做生意復雜的Q對象
* 過濾器函數可以傳遞一個或多個Q對象作為位置參數,如果有多個Q對象,這些參數的邏輯為and
* 過濾器函數可以混合使用Q對象和關鍵字參數,所有參數都將and在一起,Q對象必須位于關鍵字參數的前面
- 系統編程
- 1.進程
- 1.1.fork
- 1.2.多個進程能否修改全局變量
- 1.3多次fork的問題
- 1.4.進程的創建-multiprocessing
- 1.5.進程的創建-Process子類
- 1.6.進程池Pool
- 1.7.進程間通信--Queue
- 2.線程
- 2.1.多線程-Threading
- 2.2.threading注意點
- 2.3.多線程-共享全局變量
- 2.4.線程和進程的對比
- 2.5.同步
- 2.6.互斥鎖
- 2.7.多線程-非共享數據
- 2.8.死鎖
- 2.9.同步應用
- 2.10.生產者與消費者模式
- 2.11.ThreadLocal
- 2.12.異步
- 2.13.GIL的問題
- 網絡編程
- 1.網絡概述-udp
- 1.1.TCP/IP
- 1.2.端口
- 1.3.ip地址
- 1.4.socket簡介
- 1.5.UDP介紹
- 1.6.udp網絡程序-發送數據
- 1.7.udp網絡程序-發送、接收數據
- 1.8.udp網絡程序-端口問題
- 1.9.udp綁定信息
- 2.0.udp網絡通信過程
- 2.1.udp應用:echo服務器
- 2.2.udp應用:聊天室
- 2.3.udp總結
- 2.4.udp綜合-模擬QQ
- 2.TFTP下載和上傳
- 3.TCP/IP
- 3.1.打開瀏覽器訪問百度的過程
- web服務器
- 1.1.MyWebServer.py
- 1.2.MyWebFramework.py
- 正則
- 1.1.re模塊
- 1.2.字符
- 1.3.原始字符串
- 1.4.表示數量
- 1.5.表示邊界
- 1.6.匹配分組
- 1.7.貪婪和非貪婪
- 數據結構和算法
- 1.引入概念
- 1.1.第一次嘗試
- 1.2.算法的提出
- 1.3.第二次嘗試
- 1.4.算法效率衡量
- 1.5.算法分析
- 1.6.常見時間復雜度
- 1.7.python內置類型性能分析
- 1.8.數據結構
- 2.順序表
- 2.1.順序表的形式
- 2.2.順序表的結構和實現
- 2.3.順序表的操作
- 2.4.python中的順序表
- 3.鏈表
- 3.1.單向鏈表
- 3.2.單向循環鏈表
- 3.3.雙向鏈表
- 4.棧
- 4.1.棧的結構實現
- 5.隊列
- 5.1.隊列的實現
- 5.2.雙端隊列
- 6.排序和搜索
- 6.1.冒泡排序
- 6.2.選擇排序
- 6.3.插入排序
- 6.4.快速排序
- 6.5.哈希排序
- 6.6.歸并排序
- 6.7.常見排序算法效率比較
- 6.8.搜索
- 7.樹與樹算法
- 7.1.二叉樹
- 7.2.二叉樹的遍歷
- 初識Django
- 1.小白
- 2.初次嘗試
- 3.管理站點
- 4.視圖
- 5.模板
- django模型
- 1.定義模型
- 2.模型成員
- 3.模型查詢
- 4.自連接
- django視圖
- django模板
- django高級
- django第三方
- django-git