You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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,提问作者Павел Васильев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:25:39