I am working with Postgres in a Django application, and I want to make a model change by dropping the string so that it is no longer the primary key.
This is what my model currently looks like in Django:
class Meeting(TimeStampedModel): row = models.CharField(max_length=20, primary_key=True) total_items = models.IntegerField()
I ran django-admin.py flush to remove all data from the database. If I run python manage.py makemigrations , I see No changes detected . So, we start with a clean base.
Now I am editing row in models.py, so it is no longer the main key:
row = models.CharField(max_length=20)
And run python manage.py makemigrations and set 1 as the default when asked:
You are trying to add a non-nullable field 'id' to meeting without a default; we can't do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows) 2) Quit, and let me add a default in models.py Select an option: 1 Please enter the default value now, as valid Python The datetime and django.utils.timezone modules are available, so you can do eg timezone.now() >>> 1 Migrations for 'frontend': 0007_auto_20150305_1129.py: - Add field id to meeting - Alter field row on meeting
It seems to be working fine. Then if I run python manage.py migrate :
$ python manage.py migrate Operations to perform: Synchronize unmigrated apps: debug_toolbar Apply all migrations: contenttypes, frontend, sites, auth, sessions Synchronizing apps without migrations: Creating tables... Installing custom SQL... Installing indexes... Running migrations: Applying frontend.0007_auto_20150305_1129...Traceback (most recent call last): File "manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "/Users/me/.virtualenvs/meetings/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line utility.execute() ... File "/Users/me/.virtualenvs/meetings/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute return self.cursor.execute(sql, params) django.db.utils.ProgrammingError: multiple default values specified for column "id" of table "frontend_meeting"
Why does this tell me that I have multiple default values ?
Do I need to set a unique default primary key value - and if so, how can I do this?
Here's what the migration file looks like:
class Migration(migrations.Migration): dependencies = [ ('frontend', '0006_auto_20150305_1050'), ] operations = [ migrations.AddField( model_name='meeting', name='id', field=models.AutoField(auto_created=True, primary_key=True, default=1, serialize=False, verbose_name='ID'), preserve_default=False, ), migrations.AlterField( model_name='meeting', name='row', field=models.CharField(max_length=20), preserve_default=True, ), ]