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))

这坨代码学到的有:

  1. 输出函数:self.stdout.write和self.stderr.write,一个是普通输出,一个有字体变红的样式。
  2. 给字体加个变绿的样式: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])
  1. name或者flags:如果前面没有 - 的话,它就被识别为name(命令行必需要传入的位置参数,选择性传入),如果前面有 - 的话,它就被识别为一个选项(必传参数)。

  2. 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'])
    
  3. nargs:取值为一个整数,'?','*'和'+'。

    • 整数为表示这个参数取后面多少个值。
    • '?'表示如果传入了参数,则取一个参数,如果没有传入参数,会取默认default的值。如果写了可选参数且可选参数后面没有值传入的话,可选参数的值会取const的值。
    • '*'表示取后面0个或者多个参数。
    • '+'表示取一个或者多个参数,不足一个会报错。
  4. const:默认为None。用法如上。

  5. default:默认为None。对于选项,命令行未传入值的时候会传入默认值。对于位置参数,未写未知参数的变量的时候会自动为默认值。如果写了位置参数的变量,则需要将nargs声明为'?'然后用const设置默认值。

  6. type:类型转换器,可以写:str, float, int, ord 等。

  7. choices:传入一个可迭代对象,让这个参数取值只能枚举。

  8. require:声明一个位置参数为必传参数:require=True。

  9. help:调用-h和--help时,帮助信息右边输出的字符串。不写默认为空,如果想在帮助信息中不显示这个参数选项就这么设置:help=argparse.SUPPRESS。

  10. metavar/dest:都是给参数取别名,metavar的优先级大于dest。dest别名的时候会给选项起传入的字母别名,而会给位置参数起传入字母全部大写后的别名。这个别名没有什么实际意义。

参考博客

posted @ 2021-09-30 22:02  nerd`  阅读(17)  评论(0编辑  收藏  举报