0

I am building an app in Django.

I created a new (still empty) model having an ArrayField of DateTimeField, defined as follow:

Record_time_values = ArrayField(models.DateTimeField(), blank=False, null=False) 

As I run

python manage.py makemigrations
python manage.py migrate

I get

django.db.utils.ProgrammingError: cannot cast type timestamp with time zone to timestamp with time zone[] LINE 1: ...estamp with time zone[] USING "Record_time_values"::timestam...

I did a little research and this is the thread that gets closest to my issue, but I don't want to go deep using SQL to fix the problem.

Does not it exist a clean way to fix the problem via pure python / Django?

In alternative, does exist a good way to store an array of DateTimeField inside a model, bypassing the arrayfield?

Complete Traceback:

(met5) C:\Users\Tommaso\Django rest framework\Udemy Django\aqi_luftdaten>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, pm_lookup, sessions
Running migrations:
  Applying pm_lookup.0003_auto_20200602_1142...Traceback (most recent call last):
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.CannotCoerce: cannot cast type timestamp with time zone to timestamp with time zone[]
LINE 1: ...estamp with time zone[] USING "Record_time_values"::timestam...
                                                             ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\management\base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\management\base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\management\commands\migrate.py", line 234, in handle
    fake_initial=fake_initial,
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\migrations\executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\migrations\executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\migrations\executor.py", line 245, in apply_migration
    state = migration.apply(state, schema_editor)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\migrations\migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\migrations\operations\fields.py", line 249, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\base\schema.py", line 535, in alter_field
    old_db_params, new_db_params, strict)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\postgresql\schema.py", line 124, in _alter_field
    new_db_params, strict,
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\base\schema.py", line 685, in _alter_field
    params,
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\base\schema.py", line 137, in execute
    cursor.execute(sql, params)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py", line 99, in execute
    return super().execute(sql, params)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: cannot cast type timestamp with time zone to timestamp with time zone[]
LINE 1: ...estamp with time zone[] USING "Record_time_values"::timestam...
Tms91
  • 3,456
  • 6
  • 40
  • 74

1 Answers1

1

Ok, reproduced. This happens when you alter a column to an array from a normal datetimefield. If you just create the field as an array field with datetimefield, then the problem does not occur.

Since the table is still empty, you should do some migration maintenance and instead of creating the field and then altering it, create it the right way. This may involve rolling back one or more migrations, that may destroy data in other tables. If that's a problem, then you should backup those tables before doing this. See Reversing migrations for details.

  • thanks, I'll try to work on it ASAP. By now I did a little work-around, just to go on with my work. – Tms91 Jun 02 '20 at 11:09
  • Thanks, it worked! I reversed migrations the hard way, by deleting all files in folder migrations except folder "__pycache__" and file "__init.py__" , and inside folder "__pycache__" I deleted all files except the one starting with "__init__" – Tms91 Jun 04 '20 at 10:44