Django中makemigrations和migrate命令如何同步数据库迁移?

2026-05-07 01:570阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1173个文字,预计阅读时间需要5分钟。

Django中makemigrations和migrate命令如何同步数据库迁移?

当你没有修改`models.py`文件时,执行`python manage.py makemigrations`命令,结果会显示没有检测到更改,但仍然会生成一个空迁移文件(例如`0002_auto_20240510_1523.py`)。这是因为模型类中可能写入了动态内容,例如使用`default=datetime.now()`而不是`default=datetime.now()`(注意括号)。Django每次运行`makemigrations`都会重新导入模型,如果默认值是函数调用(带括号),它每次都会看到不同的当前时间,因此认为字段发生了变化。

  • 正确写法:default=timezone.now(不带括号,传函数对象)或 default=datetime.now(同理)
  • 错误写法:default=datetime.now()default=uuid4()(立即执行,每次导入都不同)
  • 另一个常见原因:修改了 Meta.orderingverbose_name 等不影响数据库结构的属性,Django 默认不忽略它们——可加 --name 手动跳过,或在 settings.py 中设 MIGRATION_MODULES 后统一管理

migrate 执行时报错 “Table already exists” 怎么办

典型错误信息:django.db.utils.ProgrammingError: relation "myapp_mymodel" already exists

阅读全文
标签:django

本文共计1173个文字,预计阅读时间需要5分钟。

Django中makemigrations和migrate命令如何同步数据库迁移?

当你没有修改`models.py`文件时,执行`python manage.py makemigrations`命令,结果会显示没有检测到更改,但仍然会生成一个空迁移文件(例如`0002_auto_20240510_1523.py`)。这是因为模型类中可能写入了动态内容,例如使用`default=datetime.now()`而不是`default=datetime.now()`(注意括号)。Django每次运行`makemigrations`都会重新导入模型,如果默认值是函数调用(带括号),它每次都会看到不同的当前时间,因此认为字段发生了变化。

  • 正确写法:default=timezone.now(不带括号,传函数对象)或 default=datetime.now(同理)
  • 错误写法:default=datetime.now()default=uuid4()(立即执行,每次导入都不同)
  • 另一个常见原因:修改了 Meta.orderingverbose_name 等不影响数据库结构的属性,Django 默认不忽略它们——可加 --name 手动跳过,或在 settings.py 中设 MIGRATION_MODULES 后统一管理

migrate 执行时报错 “Table already exists” 怎么办

典型错误信息:django.db.utils.ProgrammingError: relation "myapp_mymodel" already exists

阅读全文
标签:django