Django3.2 MySQL环境下migration无法设置字段默认值问题求助
问题根因
Django模型字段的default参数默认仅在Django代码运行层面生效,不会自动写入数据库的表结构配置中,所以你直接在数据库侧查看表结构会看不到默认值,这种情况下你通过Django ORM操作写入数据时,默认值还是会正常填充,仅直接操作数据库表时不会触发默认值逻辑。
解决方案
Django 3.2及以上版本原生支持db_default参数,专门用于设置数据库层面的字段默认值,调整模型写法如下即可生效:
from django.db import models from django.utils import timezone from django.db.models import Value from django.db.models.functions import Now class tblusers(models.Model): # 同时保留default保证Django运行时逻辑兼容,db_default指定数据库级默认值 created_at = models.DateTimeField(default=timezone.now, db_default=Now()) is_active = models.BooleanField(default=0, null=True, db_default=Value(0))
修改完成后重新执行makemigrations和migrate命令生成并运行迁移,再查看数据库表结构就能看到对应的默认值配置。
注意事项
- 如果是给已存在的表新增字段,执行迁移时Django会自动将表中现有历史数据的对应字段更新为你设置的
db_default值 - 如果你没有直接通过原生SQL操作数据库表的需求,原本的写法已经可以正常满足业务需求,不需要额外修改
- 不想用
db_default参数的话也可以手动修改迁移文件,添加RunSQL执行ALTER TABLE语句手动设置字段默认值,不过官方更推荐用db_default参数保证迁移逻辑的可维护性
内容的提问来源于stack exchange,提问作者Abcdef
相关产品推荐
相关产品推荐

