Django 简明教程

Django – Update Model

Django 的 ORM API 提供了有用的功能,用于对关系数据库中表格中存储的数据执行 CRUD 操作。

create(), update()delete() 方法在其各自已存在的表格上执行相应操作。但是,您通常需要通过添加、删除或更改模型的属性来更改模型结构本身。Django 的管理界面有助于处理这些活动。

The Migration System in Django

Django 有一些强大的 migration system ,用于处理模型更新过程。

Django 通过迁移机制将您对模型的更改(添加字段、删除模型等)传播到数据库架构中。与迁移相关的命令使用 manage.py 脚本执行。

可用的命令如下 −

  1. migrate − 负责应用和解除迁移。

  2. makemigrations − 负责根据对模型所做的更改创建新的迁移。

  3. sqlmigrate − 显示迁移的 SQL 语句。

  4. 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

django update model

如果你觉得有必要更改任何模型的结构,则需要再次运行 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 结构已还原。