1. 程式人生 > >Django model進階

Django model進階

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 database
for article in queryResult: print(article.title) # hits database

 一般來說,只有在“請求”查詢集 的結果時才會到資料庫中去獲取它們。當你確實需要結果時,查詢集 通過訪問資料庫來求值。 關於求值發生的準確時間.

快取機制

每個查詢集都包含一個快取來最小化對資料庫的訪問。理解它是如何工作的將讓你編寫最高效的程式碼。

在一個新建立的查詢集中,快取為空。首次對查詢集進行求值 —— 同時發生資料庫查詢 ——Django 將儲存查詢的結果到查詢集的快取中並返回明確請求的結果(例如,如果正在迭代查詢集

,則返回下一個結果)。接下來對該查詢集 的求值將重用快取的結果。

請牢記這個快取行為,因為對查詢集使用不當的話,它會坑你的。例如,下面的語句建立兩個查詢集,對它們求值,然後扔掉它們: