7

In my models.py, i have some models with this kind of attributes:

timestamp = models.TimeField(default=0)

I want to change them to:

timestamp = models.DateTimeField(default=0)

Using

python manage.py schemamigration app --auto 

works in first instance. But

python manage.py migrate app

leads to this error:

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

So i somehow needs to make this casting possible. For every time without date i want to set a default date (e.g. yesterday). How can i do this? I only found this on SO, which does not help at all because of that error. BTW: I am using postgres and python3.

I appreciate your help!

It is okay for me to use SQL direct on the database (without south) if that's easier

Community
  • 1
  • 1
svenwildermann
  • 631
  • 6
  • 20

2 Answers2

12

That's because time cannot be converted (casted) to timestamp (neither their time-zone related variants) in PostgreSQL. F.ex. this will also fail:

SELECT 'now'::time::timestamp

In these cases, you should use the USING clause in your ALTER TABLE statement (if you can edit it directly):

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

Your query will look like, f.ex.:

ALTER TABLE "my_model"
ALTER COLUMN "column_name"
SET DATA TYPE TIMESTAMP WITH TIME ZONE USING 'yesterday'::date + "column_name"
svenwildermann
  • 631
  • 6
  • 20
pozs
  • 34,608
  • 5
  • 57
  • 63
  • 1
    "That's because time cannot be converted (casted) to timestamp (neither their time-zone related variants) in PostgreSQL." Aughhhhh. Then how did the shitty schema I'm working with right now pass code revieeewwwwww. Thanks this answer was really helpful. – JeremyKun Jun 16 '17 at 22:22
  • did the above steps but still getting the same error – FightWithCode Jun 12 '20 at 18:01
5

If you didn't have any data in your tables, then you can delete your migrations from migrations folder of your app and change the field to DateTime then do the initial migration. My problem solved, without touching the SQL Queries

vikas0713
  • 566
  • 7
  • 9