创建 Django 应用(app)
在 Django 中,每一个应用(app)都是一个 Python 包,每个 app 都可用来实现一个完整的功能,整个 Django 项目就是由多个 app 组成的
创建 app
app 只能在 Django 项目文件夹下的命令行中创建,键入python manage.py startapp appDemo
命令可以在项目文件夹下创建一个名为appDemo
的 app
E:\django\djDemo>python manage.py startapp appDemo
创建好的 app 目录格式如下:
其中文件功能如下:
- _ _ init _ _:用来标识这个文件夹是一个 Python 包
- admin.py:是 app 管理员用来进行后台管理文件
- apps.py:app 的配置文件
- models.py:用来存放和数据库内容相对应的实体
- tests.py:用来写测试代码的文件
- views.py:接收请求,进行处理,返回应答
将 app 添加进 Django 项目
刚创建好的 app 并没有和 Django 项目关联,我们要在项目中的 settings.py 文件中的INSTALLED_APPS
列表里添加 app 的名字,如下所示:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'appDemo',
]
这样我们的 app 就算创建完成并关联到 Django 项目了
设计模型并关联数据库
Django 内部支持 ORM 框架,也就是说,我们可以在 Django 中创建模型并关联数据库,就可以不适用 SQL 语句实现数据的增删改查
创建模型
Django 中的模型就是 app 下 model.py 中的类,我们可以定义一个类,让它继承django.db.models.Model
来使它变成一个模型,示例如下:
from django.db import models
# 图书类
class BookInfo(models.Model):
# CharField 说明是一个字符串,max_length 指定字符串的最大长度
btitle = models.CharField(max_length=255)
# DateField 说明是一个日期类型
bpub_date = models.DateField()
class User(models.Model):
uname = models.CharField(max_length=30)
upassword = models.CharField(max_length=20)
# True 代表男
ugender = models.BooleanField(default=True)
ubirth = models.DateField()
# 关系属性,建立 BookInfo 和 User 的一对多关系
# 关系属性对应的表的字段名为 关系属性名_id
ubook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
上边使用这个方法创建了两个模型,并使用外键ForeignKey
进行了关联,这里需要强调一下,在高版本的 Django 中需要在models.ForeignKey
方法中添加on_delete
属性,上面的 BookInfo 和 User 为一对多的关系
关联数据库
在 Django 中关联数据库分为两步,第一步是迁移(生成迁移文件),第二步是同步(执行迁移文件生成表)
迁移
迁移是在项目文件夹下,使用python manage.py makemigrations
命令实现的,它是将数据库的操作,以文件的形式保存下来
E:\django\djDemo>python manage.py makemigrations
Migrations for 'appDemo':
appDemo\migrations\0001_initial.py
- Create model BookInfo
- Create model User
如上图所示就是迁移成功了,这时在 app 的 migrations 文件夹下会生成名为 0001_initial.py 的迁移文件
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='BookInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('btitle', models.CharField(max_length=255)),
('bpub_date', models.DateField()),
],
),
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uname', models.CharField(max_length=30)),
('upassword', models.CharField(max_length=20)),
('ugender', models.BooleanField(default=True)),
('ubirth', models.DateField()),
('ubook', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='appDemo.BookInfo')),
],
),
]
可以看到,Django 会自动为所有的模型添加 id 属性,不需要我们手动添加
在这里要强调,每次修改后的迁移都会生成新的迁移文件,这时不要删除之前的迁移文件,因为它们之间是互相关联的
同步
同步的作用就是执行刚刚生成的迁移文件,在数据库中生成实体表
和迁移相似,同步需要在项目文件夹下执行python manage.py migrate
命令
E:\django\djDemo>python manage.py migrate
Operations to perform:
Apply all migrations: admin, appDemo, auth, contenttypes, sessions
Running migrations:
Applying appDemo.0001_initial... OK
如上所示即为与数据库关联成功了
这里使用的是 Django 自带的 sqlite3 数据库,数据库文件在项目目录中,想改成 mysql 数据库,只需要修改 settings.py 中的DATABASE
就可以,mysql 修改如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django
'NAME': 'django',
'USER': 'root',
'PASSWORD': '*********', # 密码
'HOST': 'localhost',
'PORT': '3306',
}
}