Django:在models.py中将TimeField更改为DateTimeField

Posted

技术标签:

【中文标题】Django:在models.py中将TimeField更改为DateTimeField【英文标题】:Django: Change TimeField to DateTimeField in models.py 【发布时间】:2014-07-16 12:52:54 【问题描述】:

在我的 models.py 中,我有一些具有这种属性的模型:

timestamp = models.TimeField(default=0)

我想把它们改成:

timestamp = models.DateTimeField(default=0)

使用

python manage.py schemamigration app --auto 

在第一个实例中起作用。 但是

python manage.py migrate app

导致此错误:

django.db.utils.ProgrammingError: column "timestamp" cannot be cast to type timestamp with time zone

所以我需要以某种方式使这种铸造成为可能。对于每次没有日期的时间,我都想设置一个默认日期(例如昨天)。我怎样才能做到这一点? 我只在 SO 上找到了this,由于那个错误,这根本没有帮助。 顺便说一句:我正在使用 postgres 和 python3。

感谢您的帮助!

如果这样更容易的话,我可以直接在数据库上使用 SQL(不带南)

【问题讨论】:

你可能想要的东西叫做数据迁移:south.readthedocs.org/en/latest/tutorial/… 这篇文章有帮助吗? ***.com/a/14362743/1628832 【参考方案1】:

这是因为 time 在 PostgreSQL 中无法转换(转换)为 timestamp(两者都不是与时区相关的变体)。前任这也会失败:

SELECT 'now'::time::timestamp

在这些情况下,您应该在ALTER TABLE 语句中使用USING 子句(如果您可以直接编辑它):

ALTER TABLE [如果存在] [仅] 名称 [*]
ALTER [ COLUMN ] column_name
[ SET DATA ] TYPE data_type [ COLLATE collat​​ion ] [ USING 表达式 ]

您的查询将类似于 f.ex.:

ALTER TABLE "my_model"
ALTER COLUMN "column_name"
SET DATA TYPE TIMESTAMP WITH TIME ZONE USING 'yesterday'::date + "column_name"

【讨论】:

“这是因为时间不能在 PostgreSQL 中转换(转换)为时间戳(与时区相关的变体都不是)。”啊啊啊。那么我现在正在使用的糟糕架构如何通过代码revieeewwwwww。谢谢这个答案真的很有帮助。 执行了上述步骤,但仍然出现同样的错误【参考方案2】:

如果您的表中没有任何数据,那么您可以从应用程序的迁移文件夹中删除您的迁移并将该字段更改为 DateTime,然后进行初始迁移。 我的问题解决了,没有触及 SQL 查询

【讨论】:

以上是关于Django:在models.py中将TimeField更改为DateTimeField的主要内容,如果未能解决你的问题,请参考以下文章

django 反向生成models.py

在models.py 之外接收django-allauth 信号?

为啥 django 强制所有模型类都在 models.py 中?

models.py中增加了字段,django中怎样更新

django使用models创建表

在 Django Admin 中创建自定义显示字段(models.py 中不存在)