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

7 投票
2 回答
7880 浏览
提问于 2025-04-18 07:43

在我的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

所以我需要想办法让这个转换变得可行。每当没有日期的时候,我想设置一个默认日期(比如昨天)。我该怎么做呢? 我只在网上找到了这个,但因为那个错误,它根本没有帮助。 顺便说一下:我正在使用Postgres和Python3。

谢谢你的帮助!

如果直接在数据库上用SQL(不使用south)更简单,我也可以接受。

2 个回答

5

如果你的表里没有任何数据,那么你可以直接删除应用程序中的迁移文件夹里的迁移文件,然后把字段改成日期时间类型,接着再进行初始迁移。这样我的问题就解决了,而且没有动到任何SQL查询。

12

这是因为在PostgreSQL中,time类型不能直接转换成timestamp类型(包括它们的时区相关变种)。例如,下面的操作也会失败:

SELECT 'now'::time::timestamp

在这种情况下,如果你可以直接编辑表格,你应该在你的ALTER TABLE语句中使用USING子句:

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
ALTER [ COLUMN ] column_name
[ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]

你的查询可能看起来像这样,例如:

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

撰写回答