2015-11-02 2 views
2

У меня была модель, как этогоДжанго модели AutoField ошибка

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

Я мигрировал эту модель. После того, как я решил сделать поле приоритета в качестве первичного ключа с AutoField

Тогда моя модель выглядит следующим образом:

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

Я сделал миграцию и перенести эти изменения.

Теперь снова мне нужно было вернуться назад. Теперь я внесла следующие изменения:

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

Я сделал миграцию. Теперь, когда я перенесу я получаю следующее сообщение об ошибке:

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

Мое понимание приоритетов поле было установлено значение AutoField раньше, и он не удаляется. Пожалуйста, помогите

Моей первой миграции выглядеть следующим образом:

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

Второй миграция выглядит следующим образом:

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

Можете ли вы опубликовать hte-миграции, которые были сгенерированы для обоих этапов? – solarissmoke

+0

@solarissmoke Я опубликовал созданные миграции – wrufesh

ответ

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

В вашем столе уже есть AutoField, и с первой операции вы добавляете еще один.

Чтобы избежать этого, просто поменять местами операции в вашей миграции, как это:

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

Т.е.сначала измените поле (удалите AutoField из таблицы), а после этого - добавьте свой идентификатор AutoField назад.

0

Это потому, что AutoField не была удалена так же, как вы правильно указали. Удалите эти два файла миграции и снова запустите makemigrations. Если это не сработает, вам может потребоваться также удалить файл миграции до этого и снова выполнить миграции.

В качестве последнего средства вы можете просто удалить файлы миграции, кроме файла init .py. Но тогда я уверен, что он должен работать, как только вы удалите эти две миграции и выполните новую миграцию оттуда.

0

Да, я получил простой взламывание проблемы. Это как это

сделать окончательное изменение так:

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

Здесь приоритет поле должно быть дано новое имя («prioriti»), так что предыдущая один получает полностью удален и новое поле создается.

Теперь сделайте и примените миграцию.

Теперь снова переименуйте поле «prioriti» обратно в «приоритет». И сделать и применить миграцию.

И все готово.

Смежные вопросы