Django执行模型迁移后数据库表缺失部分字段问题咨询
问题原因
你所有缺失的字段都错误使用了Python类型标注语法(冒号:)来定义Django模型字段,而非正确的属性赋值语法(等号=)。Django ORM扫描模型时,只会将被赋值为models.Field子类实例的类属性识别为需要映射到数据库的字段,类型标注的内容不会被ORM解析,自然不会生成对应的表字段。
你使用的错误写法属于合法的Python类型标注语法,Django不会对类的类型标注做额外校验,因此执行迁移命令全程不会抛出异常,只是不会生成对应字段。
# 错误写法:用了冒号,属于类型标注,不被ORM识别 created_at_one: models.DateField(auto_now_add=True) title: models.CharField(max_length=20)
# 正确写法:用等号赋值,ORM会识别为数据库字段 created_at_one = models.DateField(auto_now_add=True) title = models.CharField(max_length=20)
修复步骤
- 把所有模型字段定义的冒号全部替换为等号,修改后的完整模型代码如下:
from django.db import models class Todo(models.Model): content = models.CharField(max_length=100) created_at_one = models.DateField(auto_now_add=True) finished_at = models.DateField(null=True) is_completed = models.BooleanField(default=False) list = models.ForeignKey( "TodoList", related_name="todos", on_delete=models.CASCADE) class TodoList(models.Model): title = models.CharField(max_length=20) created_at = models.DateField(auto_now_add=True)
- 如果你是开发环境且测试数据不重要,建议删除app下
migrations目录里除了__init__.py之外的所有文件,同时删除当前的数据库文件 - 重新执行生成迁移命令:
python manage.py makemigrations - 执行迁移应用命令:
python manage.py migrate - 再次查看表结构即可看到所有字段已经正常生成
内容的提问来源于stack exchange,提问作者Andrew Lee
相关产品推荐
相关产品推荐

