- 深入理解Django:框架內幕與實現原理
- 沈聰 全樹強編著
- 376字
- 2022-05-06 12:23:58
2.1.4 call_command()函數
從函數名即可看出該函數是用于執行命令的,即Django支持的那些命令,如check、shell、startproject、migrate等。該函數可接受一個或者多個參數,第1個參數為命令名稱(command_name)或者一個Command對象。如果是后者,則可根據Command對象反推得到命令名稱。該函數最后調用的是對應命令的Command對象中的execute()方法,這個方法的核心邏輯將在后續分析命令源碼時介紹,它是所有Django命令行的入口:


在Django源碼中,Command類的祖先類為BaseCommand類,該類定義在源碼的django/core/management/base.py文件中。下面是該類的核心實現,這里省略了部分方法和注釋說明:


在后面分析命令時會看到,所有的命令調用的都是Command對象中的run_from_argv()方法。run_from_argv()方法對命令行中的相關參數進行處理后會直接調用self.execute()方法執行命令。在execute()方法中,會根據類屬性值及相關選項決定是否進行系統檢查、遷移檢查,以及是否輸出執行的SQL語句。在self.execute()方法中,最核心的為self.handle()方法。handle()方法并未提供實現代碼,而是要求后續繼承該類的子類自行實現相應的處理邏輯。