2017-06-04 2 views
0

Ich Migrationen auf meinem Produktionssystem ausgeführt wird, die eine Postgress-Datenbank verwendet, und wenn ich es laufen lasse, bekomme ich diesen Fehler:Django Postgress - mehrere Primärschlüssel sind nicht Fehler erlaubt

django.db.utils.ProgrammingError: multiple primary keys for table "website_experience" are not allowed

Aber funktioniert gut auf meine Entwicklung SQL Datenbank. Hier ist das Modell Ich arbeite mit:

class Experience (models.Model): 
    title = models.CharField(max_length = 60) 
    company = models.CharField(max_length = 60) 
    city = models.CharField(max_length = 60) 
    start_date = models.DateField(blank=False, default=datetime.now) 
    end_date = models.DateField(blank=True, null=True) 
    description = models.CharField(max_length = 1000) 
    creative_user = ForeignKey(CreativeUserProfile, models.CASCADE) 

Zunächst wird das Feld creative_user (das mein erweiterte User-Modell ist) war ein Primärschlüssel, aber änderte es ein ForeignKey sein one to many Beziehung zwischen One CreativeUser auszudrücken viele Arbeitserfahrung haben.

ist die Migration vor und nach der Änderung zu ForeignKey

class Migration(migrations.Migration): 

    dependencies = [ 
     ('website', '0003_auto_20170510_1436'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='Experience', 
      fields=[ 
       ('title', models.CharField(max_length=60)), 
       ('company', models.CharField(max_length=60)), 
       ('city', models.CharField(max_length=60)), 
       ('startDate', models.DateField()), 
       ('endDate', models.DateField(blank=True, null=True)), 
       ('creative_user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='website.CreativeUserProfile')), 
      ], 
     ), 
] 

so dass dies der Schaffung von Experience Modell zum Ausdruck bringt und dass creative_user war Primärschlüssel auf Modell. Dann, nachdem sie eine ForeignKey die Migration zu machen aussah:

class Migration(migrations.Migration): 

    dependencies = [ 
     ('website', '0004_experience'), 
    ] 

    operations = [ 
     migrations.AddField(
      model_name='experience', 
      name='id', 
      field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 
      preserve_default=False, 
     ), 
     migrations.AlterField(
      model_name='experience', 
      name='creative_user', 
      field =models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='website.CreativeUserProfile'), 
    ), 
] 

Während ich dies sagte, alle Arbeiten an Entwickler aber die Migration auf Postgress DB denkt, dass ich mehrere Primärschlüssel haben. Kann jemand etwas Licht auf das richten, was ich falsch mache?

Danke.

Antwort

0

Ich hatte das gleiche Problem und löste es, indem Sie alle Migrationsdateien von dem Punkt löschten, an dem die betroffene Tabelle erstellt wurde, und dann makemigrations ausführen und migrieren.

Ihre Migrationsdatei "0004_experience" erstellte ein oneToOneField namens "creative_user", das als Primärschlüssel festgelegt wurde. Meine Vermutung ist, änderte von einer OnToOne zu OneToMany Beziehung für die Erstellung eines neuen eindeutigen Felds (ein Auto-Inkrement-Feld "ID" und legen Sie es als Primärschlüssel) in der späteren Migration, weil "creative_user" nicht mehr einzigartig war.

Da die letzte Migration von vorherigen Migrationen abhängig ist, haben Sie zwei Primärschlüssel erhalten. Durch das Löschen dieser konfligierenden Migrationsdateien werden Sie aussortiert.

Verwandte Themen