Tms91
Tms91

Reputation: 4214

django.db.utils.ProgrammingError: can't adapt type 'dict' after I tried to add a Hstorefield to my model

I am developing an app in Django.

I tried to add a Hstorefield to my model, then I deleted it, and now I cannot anymore run the command manage.py makemigrations because I always get this error

(met5) C:\Users\Tommaso\Django rest framework\Udemy Django\Metaglossario_Gestisco>python manage.py migrate Operations to perform:   Apply all migrations: admin, app_metaglossario, auth, contenttypes, sessions Running migrations:   Applying app_metaglossario.0045_model_node_data...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.ProgrammingError: can't adapt type 'dict'

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 112, in database_forwards
    field,   File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\base\schema.py", line 447, in add_field
    self.execute(sql, 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: can't adapt type 'dict'

(met5) C:\Users\Tommaso\Django rest framework\Udemy Django\Metaglossario_Gestisco>python manage.py makemigrations Migrations for 'app_metaglossario':   app_metaglossario\migrations\0054_model_node.py
    - Create model model_node

(met5) C:\Users\Tommaso\Django rest framework\Udemy Django\Metaglossario_Gestisco>python manage.py migrate Operations to perform:   Apply all migrations: admin, app_metaglossario, auth, contenttypes, sessions Running migrations:   Applying app_metaglossario.0045_model_node_data...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.ProgrammingError: can't adapt type 'dict'

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 112, in database_forwards
    field,   File "C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\base\schema.py", line 447, in add_field
    self.execute(sql, 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: can't adapt type 'dict'

It looks like that Hstorefiels is still having some effects on my database.

I tried to empty the model in which I pu the Hstorefield, then delete it, but nothing. I even reset my database from Heroku, but the error keeps popping up.

How can I get rid of it?

Upvotes: 2

Views: 4621

Answers (3)

Kotodid
Kotodid

Reputation: 1189

For those who came here with installed hstore, but with such error. You have to initialize django.contrib.postgres.signals in your application

from django.apps import AppConfig


class YourAppConfig(AppConfig):
    name = 'your_app'

    def ready(self):
        # needed to work hstore
        import django.contrib.postgres.signals

Upvotes: 0

Dickson Chibuzor
Dickson Chibuzor

Reputation: 241

Follow these steps to get it working

  1. In your settings add the django.contrib.postgres as part of the installed apps.

  2. create a migration before the migration that used the hstore field and Copy and paste the code below in the migration file.

    from django.db import models, migrations
    from django.contrib.postgres.operations import HStoreExtension, UnaccentExtension
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('main', '0001_initial'),
        ]
    
        operations = [
            HStoreExtension(),
            UnaccentExtension()
        ]
    
  3. Create the migration that adds the hstore fields.

  4. Run migration.

This worked for me!

Upvotes: 2

ARKhan
ARKhan

Reputation: 2015

Read the Django documentation for 2.0 or above, it is clearly stated that You need to Setup the hstore extension in PostgreSQL. I was also getting the same error, to solve this try this:

sudo su - postgres              //switch to postgres user
\c database;                     //connect your database
CREATE EXTENSION IF NOT EXISTS hstore;      //create extension

Upvotes: 2

Related Questions