Django – 更新模型



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

create()、update()delete() 方法分别对已存在的表执行其各自的操作。但是,您通常需要更改模型结构本身,例如添加、删除或更改模型的属性。Django 的管理后台可以帮助处理这些活动。

Django 的迁移系统

Django 有一个强大的迁移系统,用于处理更新模型的过程。

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

以下命令可用:

  • migrate − 负责应用和撤销迁移。
  • makemigrations − 负责根据对模型所做的更改创建新的迁移。
  • sqlmigrate − 显示迁移的 SQL 语句。
  • showmigrations − 列出项目的迁移及其状态。

首次设置 Django 项目时,它会自动安装某些应用。它们列在settings.py模块中的INSTALLED_APPS部分。

这些应用中的大多数用于管理后台创建和管理用户、组、授权等,以及与这些应用相关的数据存储在其各自的表中。

我们需要第一次运行以下migrate 命令来创建 INSTALLED_APPS所需的表结构:

python manage.py migrate

运行上述命令将在应用包文件夹内创建一个名为migrations的包。所有后续的迁移脚本都存储在其中。

随后,当您创建新应用(使用startapp 命令)时,您还需要将其添加到 INSTALLED_APPS 列表中。接下来,声明新应用所需的模型。在这里,您需要为新应用创建所需的数据库表。

makemigrations 命令

让我们在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 命令

python manage.py makemigrations

将在 migrations 文件夹中创建一个迁移脚本0001_initial.py。它包含一个Migrations 类。最初使用的migrate 命令使用此脚本在settings.py的 DATABASES 部分中配置的数据库中创建一个新表:

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命令时,它将创建第二个迁移脚本

D:\workspace\myproject> python manage.py makemigrations myapp
Migrations for 'myapp':
   myapp\migrations\0002_employee.py
   - Create model Employee

使用 migrate 命令应用新的迁移文件0002_employee.py

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 表

Django Update Model

如果您认为有必要更改任何模型的结构,则需要再次运行迁移。

我们删除email 字段并添加salary 字段

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

showmigrations 命令

showmigrations命令显示到目前为止生成的迁移脚本列表,已应用的迁移显示“X”标记。

python manage.py showmigrations
myapp
   [X] 0001_initial
   [X] 0002_employee
   [ ] 0003_remove_employee_eemail_employee_salary

再次运行migrate 命令以对employee 表进行更改:

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

如何回滚更改?

如果您想回滚对employee 表的最近更改并恢复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 表的结构。

广告
© . All rights reserved.