![深入理解Django:框架内幕与实现原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/14/43738014/b_43738014.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.1.4 call_command()函数
从函数名即可看出该函数是用于执行命令的,即Django支持的那些命令,如check、shell、startproject、migrate等。该函数可接受一个或者多个参数,第1个参数为命令名称(command_name)或者一个Command对象。如果是后者,则可根据Command对象反推得到命令名称。该函数最后调用的是对应命令的Command对象中的execute()方法,这个方法的核心逻辑将在后续分析命令源码时介绍,它是所有Django命令行的入口:
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_35_3.jpg?sign=1739255537-77at1Qk9fO06k0lHzeJpEbXRdw54PK2s-0-e4b32a2397702f605499a9d867287f3b)
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_36_1.jpg?sign=1739255537-62kEac6uBYb8abP5N0Alw6GaI9Ok9Ofx-0-6b4a5cd7327e8953790138194a1e934b)
在Django源码中,Command类的祖先类为BaseCommand类,该类定义在源码的django/core/management/base.py文件中。下面是该类的核心实现,这里省略了部分方法和注释说明:
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_36_2.jpg?sign=1739255537-0yPLg7i8CC2TDMUbQsHCoxaUHcrNR5hR-0-9c6f6ca81c03c4bf6e6cd8bb3128611f)
![](https://epubservercos.yuewen.com/7EA2B2/23020638109733406/epubprivate/OEBPS/Images/42188_37_1.jpg?sign=1739255537-Lc9Tey9CQ93Q4Ca6r50c2xfoCW4h4rIa-0-faf35622c16ee877c69e5ca17e58ba04)
在后面分析命令时会看到,所有的命令调用的都是Command对象中的run_from_argv()方法。run_from_argv()方法对命令行中的相关参数进行处理后会直接调用self.execute()方法执行命令。在execute()方法中,会根据类属性值及相关选项决定是否进行系统检查、迁移检查,以及是否输出执行的SQL语句。在self.execute()方法中,最核心的为self.handle()方法。handle()方法并未提供实现代码,而是要求后续继承该类的子类自行实现相应的处理逻辑。