14

I was trying to include JSONField in my model:

from django.contrib.postgres.fields import JSONField
class Trigger(models.Model):
    solutions = JSONField(blank=True, null=True)

However, when I try to migrate the database, it gives the following error:

django.db.utils.ProgrammingError: cannot cast type text[] to jsonb
LINE 1: ...ALTER COLUMN "solutions" TYPE jsonb USING "solutions"::jsonb

What could be done here?

1

2 Answers 2

28

You can update the migration file from

operations = [
    migrations.AlterField(
        model_name='foo',
        name='bar',
        field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
    ),
]

to

operations = [
    migrations.RemoveField(
        model_name='foo',
        name='bar',
    ),
    migrations.AddField(
        model_name='foo',
        name='bar',
        field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
    ),
]
Sign up to request clarification or add additional context in comments.

2 Comments

Where is this code? I searched in settings.py but can't find "operations"
Sorry, I found the migrations folder
5

Error shows that you are trying to alter column and not add a new one. This column solutions seems to be declared as a Textfield (or Charfield) previously with data in it, which you are trying to convert to JSON field. That's why you are getting this error.

Better create a new field rather than altering a text field to JSON field and remove the previous field, if that is unnecessary.

from django.contrib.postgres.fields import JSONField

class Trigger(models.Model):
    new_solutions = JSONField(blank=True, null=True)

2 Comments

removing previous field and create a new one is working for me
If you want to retain the same name, all you have to do is comment the field, then do a makemigrations + migrate to completely remove the field, then uncomment that same field and add the modifications you'll like to do, then do another makemigrations + migrate.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.