解决Django每次迁移重复出现Alter field time_deal的问题
Django迁移重复生成time_deal字段Alter操作的解决方案
问题描述
我的Deal模型代码如下:
class Deal(models.Model): in_quantity = models.IntegerField() exchange = models.CharField(max_length=255) note = models.TextField(max_length=10000, null=True) time_deal = models.DateTimeField(default=datetime.now()) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True)
每次执行Django迁移命令时,都会重复生成针对time_deal字段的Alter field操作,迁移文件示例如下:
class Migration(migrations.Migration): dependencies = [ ("portfolio", "0024_rename_quantity_deal_in_quantity_and_more"), ] operations = [ migrations.AlterField( model_name="deal", name="note", field=models.TextField(max_length=10000, null=True), ), migrations.AlterField( model_name="deal", name="time_deal", field=models.DateTimeField( default=datetime.datetime(2023, 4, 26, 16, 59, 46, 769292) ), ), migrations.AlterField( model_name="historicaldeal", name="note", field=models.TextField(max_length=10000, null=True), ), migrations.AlterField( model_name="historicaldeal", name="time_deal", field=models.DateTimeField( default=datetime.datetime(2023, 4, 26, 16, 59, 46, 769292) ), ), ]
原因分析
问题出在time_deal字段的默认值设置:default=datetime.now()是直接调用函数并传入返回的具体时间值,而非传入函数本身。每次Django加载模型时,datetime.now()都会执行一次生成新的时间戳,迁移系统会判定该字段默认值已变更,因此重复生成AlterField操作。
解决方案
将默认值改为传入函数对象(去掉括号),让Django在需要时才调用函数:
# 方式1:使用datetime.now函数对象 time_deal = models.DateTimeField(default=datetime.now) # 方式2(推荐,适配时区设置):使用Django时区工具 from django.utils import timezone time_deal = models.DateTimeField(default=timezone.now)
修改后执行一次迁移生成新的迁移文件,后续再运行迁移时就不会重复生成time_deal字段的修改操作了。
额外说明
若项目开启了时区支持(USE_TZ = True),优先使用timezone.now,能保证时间的时区一致性,避免潜在的时区问题。
内容的提问来源于stack exchange,提问作者Павел Васильев
相关产品推荐
相关产品推荐

