django入门

/images/all/django_procedure.png
django运行流程

项目名:mydemo

1
django-admin startproject mydemo

manage.py所在目录下执行

1
2
python manage.py migrate
python manage.py createsuperuser
1
python manage.py runserver 0.0.0.0:8000
1
pip install pymysql

__init__.py中添加

1
2
import pymysql
pymysql.install_as_MySQLdb()

修改settings.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库类型
        'NAME': '', # 数据库名
        'USER': '', # 数据库用户名
        'PASSWORD': '', # 密码
        'HOST': '', # 服务器地址,本地为127.0.0.1
        'PORT': '', # 端口
    }
}

重新迁移一下

1
python manage.py migrate 

如果pymysql使用有问题,可以更换mysqlclient,安装命令如下

1
pip install mysqlclient

settings.py配置中不用修改,将上述的__init__.py清空即可

app的名字为myapp

1
python manage.py startapp myapp 

首先安装一个ipython

1
pip install ipython

打开ipython

1
python manage.py shell

输出myapp创建的表的sql语句

1
python manage.py sqlmigrate myapp 0001

”三步走策略“:

  • 编辑 models.py 文件,改变模型。
  • 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
  • 运行 python manage.py migrate 来应用数据库迁移。
1
2
3
TIME_ZONE = 'Asia/Shanghai' # 修改时区

USE_TZ = False # 注意改为False时区才生效

models.py中定义一个类(对应数据库中的表),每一个对象为对应表中一行记录

1
2
3
4
5
6
7
class Player(models.Model):
    id = models.AutoField('编号',primary_key=True)  #id自增
    username = models.CharField('用户名',max_length=20) # 变量名为列名,备注为'用户'
    password = models.CharField('密码',max_length=20)
    photo = models.CharField('头像',max_length=100,default='zzzzzzz')
    add_date = models.DateTimeField('保存日期', default=timezone.now)
    mod_date = models.DateTimeField('最后修改日期', auto_now=True)

admin.py中进行注册

1
admin.site.register(Player) # 注册Player表

1.根据定义的列名查找数据

filter的返回值为一个列表,每一项是一个Player对象、

get返回的是

1
2
3
4
5
6
# Django为主键查询提供了一个缩写:pk.下面的语句和Question.objects.get(id=1)效果一样.
>>> Question.objects.get(pk=1)
# 按照id查找
Player.objects.filter(id=5)
# 按照username查找
Player.objects.filter(username='zzz')

2.根据条件进行查询

1
2
3
4
5
6
7
8
9
# 按照photo的前缀进行查找
Player.objects.filter(photo__startswith='zz') # 查询photo列中以zz开头的行 
# 查找所有photo前缀不是'zz'的记录
Player.objects.exclude(photo__startswith='zz') # 查询photo列中以zz开头的行

# 查询当年添加的记录
cur_year = timezone.now().year
Player.objects.filter(add_date__year=cur_year) # __相当于.
Choice.objects.filter(question__question_text__startswith='W') # 多表查询

3.常用API

1
2
3
Player.objects.count() # 记录总数
Player.objects.all() # 所有Player对象
Player.objects.values_list('username',flat=True) # 查看某字段的所有不同数据
1
2
from django.contrib.auth.models import User
print(User.objects.all())

shell中操作

1
2
3
4
user = User.objects.get(username='zfp')
user.is_superuser=True
user.set_password('123456')
user.save()

注意要在admin后台管理界面中将Staff status勾选上

  1. 将app内migrations文件夹里除了__init__.py这个文件外的所有文件删除。
  2. 登录数据库,找到django_migrations这个表,然后将表内对应的app下的migrations记录删除即可。 或者直接删除库
  3. 重新执行命令
1
2
python manage.py makemigrations
python manage.py migrate
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# int ---> str
# 1对应female, 2对应male
place = models.IntegerChoices('place', 'female male')

# str ---> str
# 'A'对应'BEST','B'对应'Pass','C'对应'Failed'
GRADE = (
        ('A', 'Best'),
        ('B', 'Pass'),
        ('C', 'Failed'),
)

grade_level = models.CharField('成绩等级', choices=GRADE, max_length=1)
1
python3 -m django version

在项目根目录下建static文件夹用来保存所有静态文件。

修改settings.py引入static文件夹路径

1
2
3
4
STATIC_URL = 'static/'
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),
)

html页面中引入图片

1
2
3
4
5
# 在第一行加入下列语句
{% load static %}

# 引入static文件夹下的images文件夹的apple.png
<img src={% static 'images/apple.png' %}>

settings.py中添加以下内容

1
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
1
2
3
4
5
6
7
8
ALLOWED_HOSTS = ['127.0.0.1'] # 允许127.0.0.1访问

#将允许将cookie包含在跨站点HTTP请求中
CORS_ALLOW_CREDENTIALS = True
#添加允许执行跨站点请求的主机,为True,则将不使用白名单,并且将接受所有来源
CORS_ORIGIN_ALLOW_ALL = True
# 允许所有的请求头
CORS_ALLOW_HEADERS = ('*')

导出本项目所有需要安装的模块

1
pip freeze >requirements.txt

安装所有requirements.txt中的模块

1
pip install -r requirements.txt

添加配置文件vue.config.js: 可以让vue3将项目打包成一个js文件和一个css文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack: {
    // No need for splitting
    optimization: {
      splitChunks: false
    }
  }
})