前言

昨天那邊我推測Todo只有在他被動作的時候才會去connect DB,所以真的在被使用的地方照昨天的寫法會是在render的時候!但今天先來看看print

正題

首先先稍微驗證一下想法是不是正確的,觸發SQL的是print(todo),那在python中什麼會被print()觸發呢!?答案是magic method __repr__ or __str__

那我們接著來看ORM filter回傳的type是什麼
<class 'django.db.models.query.QuerySet'>
是這個QueruSet類別,這個我們昨天也有看到,那邊其實我到現在都還沒有很有把握說我懂了…
總之跟著這個類別下去找__repr__ or __str__這兩個magic method

這邊看到會顯示出data,到表已經從db中拿到data了!
所以我們要再根據這個線索看看取得data是透過什麼方式!
這邊可以看到他對自己做slice取值self[: REPR_OUTPUT_SIZE + 1]
而這個動作又會觸發什麼magic method呢!?google一下~
找到啦~是__getitem__那我們接著看看他會做什麼~

我們可以知道k是slice物件,所以會流向這邊

我這邊看了一下qs.query已經是組好的SQL了,尚未看到他怎麼組出來的~
而這邊有一個list(qs),這個會觸發magic method __iter__

在根據上圖的function找

一樣找線索

一樣找list的magic method __iter__

這邊就不細看了,粗看一下可以看到去執行SQL的地方~
先找query,直接print他的type看~
是在django.db.models.sql.query.Query

那這邊的connections我們也很熟悉了,他就是DatabaseWrapper
其中的ops.compiler呢~

這下就找到compiler本人囉!
最後到compiler中的execute_sql就可以看到他與db連接的地方囉~

結語

就這樣挖著挖著就挖到與db連接的地方了,有很多python magic method如果沒接觸過python的可能會看不太習慣,不過還沒看到怎麼組出SQL了的地方就是了,是有看到類似的地方,看了一眼我就先當作沒看到了XD