2015-11-02 1 views
2

J'ai eu un modèle comme celui-cimodèle django d'erreur AutoField

class Alrule(models.Model): 
    priority = models.PositiveIntegerField(unique=True) 
    rule = models.CharField(max_length=256) 

Je migré ce modèle. Après avoir décidé de faire champ priorité clé primaire avec AutoField

Alors mon modèle ressemblait à ceci:

class Alrule(models.Model): 
    priority = models.AutoField(primary_key=True) 
    rule = models.CharField(max_length=256) 

J'ai fait une migration et la migration de ce changement.

Maintenant encore une fois je devais revenir en arrière. Maintenant j'ai fait les changements suivants:

class Alrule(models.Model): 
    priority = models.PositiveIntegerField(unique=True) 
    rule = models.CharField(max_length=256) 

J'ai fait une migration. Maintenant, quand j'émigre je reçois l'erreur suivante:

AssertionError: A model can't have more than one AutoField. 

Ma compréhension est la priorité terrain a été mis à AutoField avant et il n'est pas supprimé. S'il vous plaît aider

Ma première migration ressemble à ceci:

operations = [ 
    migrations.RemoveField(
     model_name='alrule', 
     name='id', 
    ), 
    migrations.AlterField(
     model_name='alrule', 
     name='priority', 
     field=models.AutoField(serialize=False, primary_key=True), 
    ), 
] 

Deuxième migration ressemble à ceci:

operations = [ 
    migrations.AddField(
     model_name='alrule', 
     name='id', 
     field=models.AutoField(auto_created=True, primary_key=True, default=2, serialize=False, verbose_name='ID'), 
     preserve_default=False, 
    ), 
    migrations.AlterField(
     model_name='alrule', 
     name='priority', 
     field=models.PositiveIntegerField(unique=True), 
    ), 
] 
+0

Pouvez-vous publier des migrations hte qui ont été générées pour les deux étapes? – solarissmoke

+0

@solarissmoke J'ai posté des migrations générées – wrufesh

Répondre

0
operations = [ 
    migrations.AddField(
     model_name='alrule', 
     name='id', 
     field=models.AutoField(auto_created=True, primary_key=True, default=2, serialize=False, verbose_name='ID'), 
     preserve_default=False, 
    ), 
    migrations.AlterField(
     model_name='alrule', 
     name='priority', 
     field=models.PositiveIntegerField(unique=True), 
    ), 
] 

Votre table possède déjà AutoField et, lors de la première opération, vous en ajoutez une autre.

Pour éviter que tout échangez vos opérations dans votre migration comme ceci:

operations = [ 
    migrations.AlterField(
     model_name='alrule', 
     name='priority', 
     field=models.PositiveIntegerField(unique=True), 
    ), 
    migrations.AddField(
     model_name='alrule', 
     name='id', 
     field=models.AutoField(auto_created=True, primary_key=True, default=2, serialize=False, verbose_name='ID'), 
     preserve_default=False, 
    ), 
] 

à savoirpremier champ alt (supprime AutoField de la table) et après cela est fait - ajouter votre id AutoField de retour.

0

C'est parce que AutoField n'a pas été supprimé comme vous avez indiqué correctement. Supprimez ces deux fichiers de migration et relancez makemigrations. Si cela ne fonctionne pas, vous devrez peut-être également supprimer le fichier de migration avant cela et réexécuter les migrations. En dernier recours, vous pouvez simplement supprimer les fichiers de migrations en dehors du fichier init .py. Mais ensuite, je suis sûr que cela devrait fonctionner une fois que vous aurez supprimé ces deux migrations et que vous aurez effectué une nouvelle migration à partir de là.

0

Oui J'ai eu le simple problème du problème. Il est comme ça

Faire le dernier changement comme celui-ci:

class Alrule(models.Model): 
    prioriti = models.PositiveIntegerField(unique=True) 
    rule = models.CharField(max_length=256) 

Ici champ priorité doit être donnée nouveau nom (« prioriti ») de telle sorte que l'un previos est supprimé complètement et un nouveau champ est créé.

Procédez maintenant aux migrations et appliquez-les.

Renommez à nouveau le champ "prioriti" en "priorité". Et faites et appliquez la migration.

Et nous avons terminé.