django命令行
命令行三个等价:
django-admin <command> [options]
python manage.py <command> [options]
python -m django <command> [options]
常用的一些操作
查看当前django路径:
py -c "import django;print(django.__path__[0])"
python自带前端服务器:
python -m http.server # 默认8000端口
常用子命令:
[staticfiles]
runserver:运行开发服务器(*)
collectstatic:部署的时候用于收集静态文件(*)
findstatic:查看已安装的有static文件的app的路径
[django]
help: 帮助信息
version: 获取django版本
startproject:创建一个项目(*)
startapp:创建一个app(*)
shell:进入django shell(*)
dbshell:进入django dbshell
check:检查django项目完整性,后面可以指定app名字
flush:清空数据库
compilemessages:编译语言文件
makemessages:创建语言文件
makemigrations:生成数据库同步脚本(*)
migrate:同步数据库(*)
showmigrations:查看生成的数据库同步脚本(*)
sqlflush:查看生成清空数据库的脚本(*)
sqlmigrate:查看数据库同步的sql语句(*)
dumpdata:导出数据
loaddata:导入数据
diffsettings:查看你的配置和django默认配置的不同之处
inspectdb: 根据数据库生成models.py文件
[auth]
createsuperuser:创建超级管理员(*)
changepassword:修改密码(*)
[sessions]
clearsessions:清除session
[rest_framework]
generateschema:查看接口信息
[contenttypes]
remove_stale_contenttypes:删掉数据库存在,但在INSTALL_APP里面没有的app的数据
check
python manage.py check [app_name]
app_name:app名字。
startproject
django-admin startproject [project_name] [file_path]
project_name:项目名。
file_path:项目的目录。
startapp
python manage.py startapp [myapp] [file_path]
runserver
python manage.py runserver
python manage.py runserver 8000
python manage.py runserver 1.2.3.4:8000
python manage.py runserver 127.0.0.1:8000
python manage.py runserver 0.0.0.0:8000
shell
python manage.py shell
python manage.py shell -i python
python manage.py shell -i ipython
python manage.py shell -i bpython
makemigrations
作用:根据models的变化生成对应的Python代码,该代码用于更新数据库
python manage.py makemigrations [app_name]
migrate
python manage.py migrate # 默认是所有的APP的修改应用到数据库
python manage.py migrate [appname] # 指定APP的修改应用到数据库
python manage.py migrate [appname] [migrations_name] # 将操作恢复到指定版本
Django所有的migration信息都保存在django_migrations这个数据库表中,所以,遇到数据库迁移问题报错可以删掉migrations文件夹的相关文件(不能删__init__.py)还报错的话可以清除这个表,然后重新迁移。
将指定app恢复到最初版本:
python manage.py migrate myapp zero
sqlmigrate
作用:输出某一个migrate对应的SQL语句
python manage.py sqlmigrate myapp 0001_initial
python manage.py sqlmigrate [app_name] [migration_name]
showmigrations
作用:显示migrations记录。
python manage.py showmigrations
generateschema
需要导入rest_framework。查看所有的的api接口信息。需要安装:
pip install pyyaml uritemplate
python manage.py generateschema
inspectdb
python manage.py inspectdb > myapp/models.py
dumpdata
python manage.py dumpdata
python manage.py dumpdata myapp
python manage.py dumpdata myapp.User
python manage.py dumpdata myapp.User > a.json
loaddata
python manage.py loaddata a.json
必须遵守django的fixture
格式,不然会报错,格式如下:
[
{
"pk": "1",
"model": "myapp.user",
"fields": {
"username":"litter",
"password":"adsfd"
}
}
]
自定义命令
在已经于INSTALL_APP中注册过了的app中创建management文件夹,然后再manegement文件夹下创建commands文件夹,然后在其中创建一个python文件,该python文件名就是命令的名字。(如果名字前有一个'_'则不会当成命令使用。)
│ admin.py
│ apps.py
│ models.py
│ serializers.py
│ tests.py
│ views.py
│ __init__.py
│
├─management
│ └─commands
│ │ hello.py # 创建的命令文件
定义自定义命令
继承BaseCommand类,实现两个方法:add_argument和handle。add_argument用来添加参数,handle是执行函数。
from django.core.management.base import BaseCommand, CommandError
from polls.models import Question as Poll
class Command(BaseCommand):
help = 'Closes the specified poll for voting' # -h和--help的时候会显示这个字符串
def add_arguments(self, parser):
# 添加参数
parser.add_argument('poll_ids', nargs='+', type=int)
def handle(self, *args, **options):
for poll_id in options['poll_ids']:
try:
poll = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise CommandError('Poll "%s" does not exist' % poll_id)
poll.opened = False
poll.save()
self.stdout.write(self.style.SUCCESS('Successfully closed poll "%s"' % poll_id))
这坨代码学到的有:
- 输出函数:self.stdout.write和self.stderr.write,一个是普通输出,一个有字体变红的样式。
- 给字体加个变绿的样式:self.style.SUCCESS。
同时,根据源码分析,add_argument里面的parse形参是来自于argparse库,所以,语法基本相同,用这种方式来添加参数。
parse.add_argument
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
-
name或者flags:如果前面没有
-
的话,它就被识别为name(命令行必需要传入的位置参数,选择性传入),如果前面有-
的话,它就被识别为一个选项(必传参数)。 -
action:取值'store', 'store_const', 'store_true', 'store_false'。
- store:参数为传入的值(默认)
- store_const:参数的值为const传入的值。如果action设置了这个值,命令行就无需给这个参数传入值,这个值就是默认的值。
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_const', const=42) >>> parser.parse_args(['--foo']) Namespace(foo=42)
- store_true/store_false:参数的值为True/False,无需给这个参数转入值或者指定const。
- append:存储一个列表,可以让一个参数传入多个值。这样传入:'--foo 1 --foo 2',于是就foo参数对应的值就是[1, 2]。
>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append') >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['1', '2'])
-
nargs:取值为一个整数,'?','*'和'+'。
- 整数为表示这个参数取后面多少个值。
- '?'表示如果传入了参数,则取一个参数,如果没有传入参数,会取默认default的值。如果写了可选参数且可选参数后面没有值传入的话,可选参数的值会取const的值。
- '*'表示取后面0个或者多个参数。
- '+'表示取一个或者多个参数,不足一个会报错。
-
const:默认为None。用法如上。
-
default:默认为None。对于选项,命令行未传入值的时候会传入默认值。对于位置参数,未写未知参数的变量的时候会自动为默认值。如果写了位置参数的变量,则需要将nargs声明为'?'然后用const设置默认值。
-
type:类型转换器,可以写:str, float, int, ord 等。
-
choices:传入一个可迭代对象,让这个参数取值只能枚举。
-
require:声明一个位置参数为必传参数:require=True。
-
help:调用-h和--help时,帮助信息右边输出的字符串。不写默认为空,如果想在帮助信息中不显示这个参数选项就这么设置:help=argparse.SUPPRESS。
-
metavar/dest:都是给参数取别名,metavar的优先级大于dest。dest别名的时候会给选项起传入的字母别名,而会给位置参数起传入字母全部大写后的别名。这个别名没有什么实际意义。
参考博客
- django命令行全面官方文档:https://docs.djangoproject.com/en/3.2/ref/django-admin/
- django自定义命令行:https://docs.djangoproject.com/en/3.2/howto/custom-management-commands/
- django命令行介绍,新手建议阅读:https://www.django.cn/article/show-26.html
- argparse库:https://docs.python.org/zh-cn/3/library/argparse.html
- 刘江的博客:https://www.liujiangblog.com/course/django/167