2015-03-05 17 views
6

Sto lavorando con Postgres su un'app Django e voglio apportare un cambio di modello, reimpostando una riga in modo che non sia più la chiave primaria.Migrazione di Django: facendo una riga non chiave primaria, ottenendo "ProgrammingError: multiple default values"?

Questo è ciò che il mio modello attualmente si presenta come in Django:

class Meeting(TimeStampedModel): 
    row = models.CharField(max_length=20, primary_key=True) 
    total_items = models.IntegerField() 

ho eseguito django-admin.py flush per rimuovere tutti i dati dal database. Se corro python manage.py makemigrations, vedo No changes detected. Quindi partiamo da una base pulita.

Ora posso modificare row in models.py quindi non è più la chiave primaria:

row = models.CharField(max_length=20) 

E correre python manage.py makemigrations e impostare 1 come predefinita quando gli viene chiesto:

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 

Che sembra corri OK. Poi se corro 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" 

Perché è che mi dicono che ho multiple default values?

Devo impostare un valore di chiave primaria univoco come predefinito - e in tal caso, come posso farlo?

Questo è ciò che il file migrazioni assomiglia:

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, 
     ), 
    ] 
+0

Ho dovuto semplicemente cancellare le mie migrazioni preesistenti. –

risposta

8

tenta di utilizzare un migrazione intermedia per raggiungere questo obiettivo:

1) Aggiungi id = models.IntegerField() al modello. Eseguire makemigrations e quindi migrare.

2) Rimuovi primary_key = True dal campo "row" e rimuove anche il campo "id". Eseguire nuovamente makemigrations e migrare.

+4

Generalmente funziona, grazie, ma: 1) Sembra più semplice inserirli in un'unica migrazione manualmente; 2) Se si dispone di dati nella propria tabella, è necessario riempire la colonna 'id' appena creata con valori univoci e far avanzare di conseguenza la sequenza automatica prima del punto 2; 3) Se altre tabelle hanno vincoli di chiave esterna che puntano a quel tasto, è necessario rimuoverli prima del passaggio 2 e aggiungerne manualmente di nuovi dopo il passaggio 2 –

Problemi correlati