Django model進階
阿新 • • 發佈:2018-11-21
QuerySet
可切片
使用Python 的切片語法來限制查詢集記錄的數目 。它等同於SQL 的LIMIT 和OFFSET 子句。
>>> Entry.objects.all()[:5] # (LIMIT 5)
>>> Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5)
不支援負的索引(例如Entry.objects.all()[-1])。通常,查詢集 的切片返回一個新的查詢集 —— 它不會執行查詢。
可迭代
articleList=models.Article.objects.all() for article in articleList: print(article.title)
惰性查詢
查詢集 是惰性執行的 —— 建立查詢集不會帶來任何資料庫的訪問。你可以將過濾器保持一整天,直到查詢集 需要求值時,Django 才會真正執行這個查詢。
queryResult=models.Article.objects.all() # not hits database print(queryResult) # hits databasefor article in queryResult: print(article.title) # hits database
一般來說,只有在“請求”查詢集 的結果時才會到資料庫中去獲取它們。當你確實需要結果時,查詢集 通過訪問資料庫來求值。 關於求值發生的準確時間.
快取機制
每個查詢集都包含一個快取來最小化對資料庫的訪問。理解它是如何工作的將讓你編寫最高效的程式碼。
在一個新建立的查詢集中,快取為空。首次對查詢集進行求值 —— 同時發生資料庫查詢 ——Django 將儲存查詢的結果到查詢集的快取中並返回明確請求的結果(例如,如果正在迭代查詢集 ,則返回下一個結果)。接下來對該查詢集 的求值將重用快取的結果。
請牢記這個快取行為,因為對查詢集使用不當的話,它會坑你的。例如,下面的語句建立兩個查詢集,對它們求值,然後扔掉它們: