当我们需要添加一个模型类或者修改模型类中的字段信息的时候,需要进行怎样的操作才能成功呢?没错,我们需要依次运行下面两个命令:

# 创建要修改的内容文件
python manage.py makemigrations
# 执行修改
python manage.py migrate

通过上面这两个命令我们就可以将模型类的创建和修改生效到数据库中,那么你有没有想过当我们依次执行这两个命令的时候,Django都发生了什么呢?下面我将用一个例子来讲解模型类的创建和删除的过程,以及在这个过程中Django都进行了哪些操作。

1.修改操作

假如我们在model.py中新添加一个模型类Commit,并给这个类添加一个name字段,字段属性是CharField。在提交命令之前,我们观察一下三个地方:

  • 看一下APP路径下的migrations文件夹下的文件,如果你之前已经进行过模型类的更新操作,那么此文件夹下面应该是这样的文件结构

  • 再看一下数据库的django_migrations这个自动生成的表的内容,其中我们的app对应的记录有三条,这三条的记录的name字段和migrations文件夹下面的带有序号的三个文件是同名的。

  • 最后看一下我们的数据库中的表,此时imooc这个APP下只有三张表:post、tag、test。这是我们之前生成的。

好了,看完之后我们在终端执行下面的命令,来生成修改的内容:

python manage.py makemigrations

我们得到了如下的反馈:

(wprkplace) D:\PythonProject\learn>python manage.py makemigrations
Migrations for 'imooc':
  imooc\migrations\0004_commit.py:
    - Create model Commit

此时我们再去migrations这个文件夹下面可以看到,django已经为我们生成了一个0004_commit.py的文件,这个文件记录了我们要修改的内容:

文件的代码如下:

from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
    dependencies = [
        ('imooc', '0003_test'),
    ]
    operations = [
        migrations.CreateModel(
            name='Commit',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
            ],
        ),
    ]

重点主要在operations,代码的意思是说我们将要创建一个name=commit的模型类(数据表),然后创建一个name字段,它的字段属性为CharField,参数为max_length=100。需要注意的是,id字段是Django为我们自动创建的一个自增长的主键。

然后我们再看数据库中的表的数量是没有变化的,django_migrations这个表的内容也没有变化,这说明我们的修改还没有生效。然后我们执行下面这个命令,来使修改生效:

python manage.py migrate

这时,我们得到了如下的结果:

(wprkplace) D:\PythonProject\learn>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, imooc, sessions
Running migrations:
  Applying imooc.0004_commit... OK

然后我们就可以看到imooc数据库中多了一个imooc_commit的数据表,然后还可以看到django_migrations表中多了一条记录,这条记录记录了我们修改的是哪个应用下面的哪个文件。这时我们的模型类的修改操作就算是正式成功了!

2.删除操作

如果我们要删除一个模型类该怎样做呢?其实顺序也是跟我们创建一个模型类是一样的:

  1. 首先删除,模型类的代码
  2. 然后删除,migrations文件夹下面对应的操作记录文件
  3. 然后删除,django_migrations表中对应的生成记录
  4. 最后删除,数据库中的数据表

以上才是删除一个模型类的正确流程。