django的orm映射,默認的是懶加載,每次只取最少量的數(shù)據(jù),當在取querryset的過程中設計到外鍵的時候,django首先會去取想要的數(shù)據(jù)集,再去取外鍵的數(shù)據(jù)集,這樣就訪問了兩次數(shù)據(jù)庫,那取n條數(shù)據(jù)就訪問了n*n次數(shù)據(jù)庫.
擁有適度流量的網站偏友,在進入真正的麻煩前也就可以負擔起50次到數(shù)據(jù)庫的訪問金蜀。
所以一次嵌都在用你的效率在開玩笑.
- select_related
:Django ORM 最簡單的預加載工具瓦哎,對于所有一對一或多對一的數(shù)據(jù)關系旬渠,你都需要從同一個父對象獲取數(shù)據(jù),如客戶的公司名稱躁垛。這個會被翻譯成 SQL 的 join 操作谋作,這樣父對象的數(shù)據(jù)就和子對象的數(shù)據(jù)一起取回來了。(參見官方文檔) - prefetch_related
:對于更復雜的關系蝇更,即每個結果有多行(例如 many=True ),像多對一或多對多的數(shù)據(jù)關系呼盆,比如上述客戶的訂單年扩,這轉化一個二級 SQL 查詢,通常有很長的 WHERE ... IN
访圃,從中只選擇相關的行常遂。(參見官方文檔) - Prefetch
:用于復雜 prefetch_related
查詢,例如過濾子集挽荠。它也可以嵌套setup_eager_loading
進行調用。 (參見官方文檔)