Django 迁移多次检测到相同的更改

Django migrations detect the same change many times

我有这样一个模型:

MyModel(models.Model):
    ...
    date_start = models.DateTimeField(
        auto_now=True,
        editable=True
    )

    date_end = models.DateTimeField(
        default=datetime.now() + relativedelta(months=3)
    )

...

我之前修改了 date_end 字段,并进行了迁移,它工作正常,但现在它仍在检测该更改作为新迁移。任何的想法?提前致谢。

问题是您在定义的默认参数中调用 datetime.now()。这意味着每次启动 Django 时默认都会更改,因此系统认为您需要新的迁移。

您应该将该计算包装到 lambda 函数中,必要时将调用该函数:

date_end = models.DateTimeField(
    default=lambda: datetime.now() + relativedelta(months=3)
)

编辑

如果 lambda 引起问题,您可以将代码移到一个单独的函数中并将其作为默认值传递:

def default_end():
    return datetime.now() + relativedelta(months=3)

...

date_end = models.DateTimeField(
        default=default_end
)

注意这里我们传递的是函数对象,而不是结果,作为默认参数。