Django migration: making a row not primary key, getting “ProgrammingError: multiple default values”?

て烟熏妆下的殇ゞ 提交于 2019-12-30 18:27:34

问题


I am working with Postgres on a Django app and I want to make a model change, resetting a row so 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 have run 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 are starting from a clean base.

Now I edit row in models.py so it is no longer the primary 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 e.g. timezone.now()
>>> 1
Migrations for 'frontend':
  0007_auto_20150305_1129.py:
    - Add field id to meeting
    - Alter field row on meeting

That seems to run OK. 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 is it telling me I have multiple default values?

Do I need to set a unique primary key value as a default - and if so, how can I do this?

This is what the migrations 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,
        ),
    ]

回答1:


Try to use an intermediate migration to achieve this:

1) Add id = models.IntegerField() to your model. Run makemigrations and then migrate.

2) Remove primary_key=True from the 'row'-field, and also remove the 'id'-field. Again run makemigrations and migrate.



来源:https://stackoverflow.com/questions/28876973/django-migration-making-a-row-not-primary-key-getting-programmingerror-multi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!