Django 简明教程
Django – Update Model
Django 的 ORM API 提供了有用的功能,用于对关系数据库中表格中存储的数据执行 CRUD 操作。
create(), update() 和 delete() 方法在其各自已存在的表格上执行相应操作。但是,您通常需要通过添加、删除或更改模型的属性来更改模型结构本身。Django 的管理界面有助于处理这些活动。
The Migration System in Django
Django 有一些强大的 migration system ,用于处理模型更新过程。
Django 通过迁移机制将您对模型的更改(添加字段、删除模型等)传播到数据库架构中。与迁移相关的命令使用 manage.py 脚本执行。
可用的命令如下 −
-
migrate − 负责应用和解除迁移。
-
makemigrations − 负责根据对模型所做的更改创建新的迁移。
-
sqlmigrate − 显示迁移的 SQL 语句。
-
showmigrations − 列出项目的迁移及其状态。
首次设置 Django 项目时,它会自动安装某些应用。它们列在 settings.py 模块中的 INSTALLED_APPS 部分中。
这些应用中的大多数用于管理界面中以创建和管理用户、组、授权等用途,以及与这些应用相关的数据存储在各个表中。
我们需要首次运行以下 migrate command ,以创建 INSTALLED_APPS 所需的表结构 −
python manage.py migrate
运行上述命令将在 app package folder 中创建一个名为 migrations 的包。所有后续迁移脚本都存储在其中。
随后的,当您创建新应用(使用 startapp command )时,您还需要在 INSTALLED_APPS 列表中添加它。接下来,您声明新应用所需的模型。在此,您需要创建新应用所需的数据库表。
The makemigrations Command
让我们像下面这样在 models.py 模块中添加一个新模型 −
from django.db import models
# Create your models here.
class Dreamreal(models.Model):
website = models.CharField(max_length=50)
mail = models.CharField(max_length=50)
name = models.CharField(max_length=50)
phonenumber = models.IntegerField()
def __str__(self):
return "Website: {} Email: {} Name: {} Ph.: {}".format(self.website, self.mail, self.name, self.phonenumber)
class Meta:
db_table = "dreamreal"
要在数据库中传播新模型,请运行 makemigrations command −
python manage.py makemigrations
在 migrations 文件夹中将会创建一个 migrations 脚本 0001_initial.py 。其中包含一个 Migrations class 。最初使用的 migrate command 使用这个脚本在 DATABASES 部分的 settings.py 中配置的数据库中创建一个新表 −
Python manage.py migrate
最终,你决定像下面那样添加一个新的模型类,命名为 Employee −
class Employee(models.Model):
eid = models.CharField(max_length=20)
ename = models.CharField(max_length=100)
eemail = models.EmailField()
econtact = models.CharField(max_length=15)
class Meta:
db_table = "employee"
当你再次运行 makemigrations 命令时,它将创建一个第二个 migration script −
D:\workspace\myproject> python manage.py makemigrations myapp
Migrations for 'myapp':
myapp\migrations\0002_employee.py
- Create model Employee
新的 migration 文件 0002_employee.py 应用 migrate 命令 −
D:\workspace\myproject> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
Applying myapp.0002_employee... OK
如果你查看数据库结构,就能在其中找到 employee table 。
如果你觉得有必要更改任何模型的结构,则需要再次运行 migrations。
我们删除 email field 并添加 salary field 。
class Employee(models.Model):
eid = models.CharField(max_length=20)
ename = models.CharField(max_length=100)
econtact = models.CharField(max_length=15)
salary = models.IntegerField()
class Meta:
db_table = "employee"
再次运行 makemigrations 命令。
D:\workspace\myproject> python manage.py makemigrations myapp
Migrations for 'myapp':
myapp\migrations\0003_remove_employee_eemail_employee_salary.py
- Remove field eemail from employee
- Add field salary to employee
The showmigrations Command
showmigrations 命令会显示迄今为止生成的迁移脚本列表,已经应用的迁移标记为 " X "。
python manage.py showmigrations
myapp
[X] 0001_initial
[X] 0002_employee
[ ] 0003_remove_employee_eemail_employee_salary
再次运行 migrate command 以对 employee table 做出更改 −
D:\workspace\myproject> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
Applying myapp.0003_remove_employee_eemail_employee_salary... OK
How to Roll Back the Changes?
如果你想回滚对 employee table 的最近更改并还原 0002_mployee.py 脚本的状态,
D:\workspace\myproject> python manage.py migrate myapp 0002_employee
Operations to perform:
Target specific migration: 0002_employee, from myapp
Running migrations:
Rendering model states... DONE
Unapplying myapp.0003_remove_employee_eemail_employee_salary... OK
返回并更改结构以确认 employee table 结构已还原。