- Django 基础概念
- Django - 首页
- Django - 基础知识
- Django - 概述
- Django - 环境搭建
- Django - 创建项目
- Django - 应用生命周期
- Django - 创建视图
- Django - URL映射
- Django - 首页页面
- Django - 模板系统
- Django - MVT
- Django - 添加主模板
- Django 管理后台
- Django 管理后台 - 接口
- Django 管理后台 - 创建用户
- Django 管理后台 - 包含模型
- Django 管理后台 - 设置显示字段
- Django 管理后台 - 更新对象
- Django 模型
- Django - 模型
- Django - 插入数据
- Django - 更新数据
- Django - 删除数据
- Django - 更新模型
- Django 静态文件
- Django - 添加静态文件
- Django - 添加 CSS 文件
- Django 高级
- Django - 404 页面未找到
- Django - 页面重定向
- Django - 发送邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 配置
- Django - Cookie 处理
- Django - Session
- Django - 缓存
- Django - 评论
- Django - RSS
- Django - AJAX
- Django 有用资源
- Django - 快速指南
- Django - 有用资源
- Django - 讨论
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 表。
如果您认为有必要更改任何模型的结构,则需要再次运行迁移。
我们删除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 表的结构。