
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
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()方法并未提供实现代码,而是要求后续继承该类的子类自行实现相应的处理逻辑。