带有auto_now_add的Django DateTimeField要求默认值

a1o7rhls  于 2023-01-27  发布在  Go
关注(0)|答案(5)|浏览(171)

我的模型created_at = models.DateTimeField( auto_now_add = True )中有此字段
当我尝试进行迁移时,我收到一个错误:

You are trying to add the field 'created_at' with 'auto_now_add=True' to user wi
thout a default; the database needs something to populate existing rows.

 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py

我试着设置默认值,但是它说defaultauto_now_add是互斥的。当然我可以只使用默认值而不使用auto_now_add,但是我想知道为什么会弹出这个错误。我错过了什么吗?

6ljaweal

6ljaweal1#

您已经有一些行没有created_at值。但是当您添加以下字段并运行迁移时

created_at = models.DateTimeField( auto_now_add = True)

它期望现有行具有created_at值。因此,它在迁移时向您发出警告。
要解决此问题,您可以选择第一个选项Provide a one-off default now (will be set on all existing rows)。选择第一个选项时,您需要的是值。在此处,您可以输入timezone.now()。它将使用当前时间戳填充现有行。

wtzytmuj

wtzytmuj2#

删除应用程序中的迁移文件,您可以在没有错误出现时进行迁移过程,它是由于以前创建的时间对象的原因而出现的。

lymgl2op

lymgl2op3#

如果您使用的是sqlite数据库,则可以省略它,然后重新创建它,或者您可以将null=True作为DateTimeFeild()的参数,我建议您使用我之前使用的第二个参数

uxhixvfz

uxhixvfz4#

这是因为auto_now_add = True使得django决定模型的每个示例都应该有一个值而不是null。

njthzxwz

njthzxwz5#

您可以创建两个迁移,

  • 第一个设置默认值,
  • 第二个命令删除默认值并添加auto_now_add

相关问题