Django 模型迁移:从“定义类”到“真正建表”的 2 条命令

举报
周杰伦本人 发表于 2025/07/30 14:06:01 2025/07/30
【摘要】 Django 模型迁移:从“定义类”到“真正建表”的 2 条命令 一、为什么会出现“没有表”定义了模型类 ≠ 数据库里就有表。Django 的 ORM 采用「先描述、后迁移」机制:用 Python 类描述表结构(models.py)。用 makemigrations 生成“建表/改表脚本”。用 migrate 真正把脚本执行到数据库。只有完成 2 + 3,才能在数据库里看到对应的表。 二、...

Django 模型迁移:从“定义类”到“真正建表”的 2 条命令

一、为什么会出现“没有表”

  • 定义了模型类 ≠ 数据库里就有表

  • Django 的 ORM 采用「先描述、后迁移」机制:

    1. 用 Python 类描述表结构(models.py)。

    2. makemigrations 生成“建表/改表脚本”。

    3. migrate 真正把脚本执行到数据库。

  • 只有完成 2 + 3,才能在数据库里看到对应的表。

二、两条核心命令

命令 作用 类比
python manage.py makemigrations 扫描models.py → 生成迁移文件(*.py) “写施工图纸”
python manage.py migrate 把迁移文件翻译成 SQL 并执行到数据库 “按图纸盖房子”

三、一步一步来

  1. 定义模型类(已完成)
# book/models.py
from django.db import models

class Book(models.Model):
  name = models.CharField(max_length=20)

class People(models.Model):
  name   = models.CharField(max_length=20)
  gender = models.BooleanField()
  book   = models.ForeignKey(Book, on_delete=models.CASCADE)
  1. 注册子应用
    book_manager/settings.pyINSTALLED_APPS 里加上 'book',否则 Django 检测不到模型。

  2. 生成迁移文件

python manage.py makemigrations

成功后会提示:

Migrations for 'book':
book/migrations/0001_initial.py
  - Create model Book
  - Create model People

此时数据库里还没有表,只有 book/migrations/0001_initial.py 这个“施工图”。

  1. 执行迁移(真正建表)
python manage.py migrate

输出示例:

Applying book.0001_initial... OK

现在数据库里会出现:

book_book   (id, name)
book_people (id, name, gender, book_id)

四、常见疑问 FAQ

问题 原因 & 解决
No changes detected 子应用未注册 → 确认 INSTALLED_APPS 包含 'book'
缺少表 只执行了 makemigrations 没执行 migrate → 补跑 migrate
修改字段后无效 修改模型 → 重新 makemigrationsmigrate 即可。

五、一分钟速记

  1. 改模型 → makemigrations(生成脚本)

  2. 真正建表 → migrate(执行脚本)

  3. 顺序不能反,缺一不可。

把这两条命令刻在脑子里:

python manage.py makemigrations
python manage.py migrate
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。