9

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?

QuestionEverything
  • 4,809
  • 7
  • 42
  • 61

2 Answers2

21

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),
    ),
]
Rich Tier
  • 9,021
  • 10
  • 48
  • 71
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)
Raj Subit
  • 1,487
  • 2
  • 12
  • 23
  • removing previous field and create a new one is working for me – Harun-Ur-Rashid Oct 01 '19 at 11:29
  • 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`. – Eyong Kevin Enowanyo Nov 18 '21 at 10:14