2015-11-02 36 views
2

我有過這樣Django的模型下拉列表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),然後完成 - 添加您的id AutoField。

0

這是因爲下拉列表AutoField並沒有被刪除,就像你正確顯示。刪除這兩個遷移文件並再次運行makemigrations。如果不起作用,則可能還必須先刪除遷移文件,然後再次運行遷移。

作爲最後的手段,您可以刪除init .py文件以外的遷移文件。但是,我相信只要刪除這兩個遷移並從那裏進行新的遷移,它就可以工作。

0

是的,我得到了簡單的問題。正是這樣的

作出這樣的最終變化:

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

以下優先領域應該被賦予新的名稱(「prioriti」),這樣previos一個被完全刪除,並創建一個新的領域。

現在製作並應用遷移。

現在再次將「prioriti」字段重命名爲「priority」。並制定和應用遷移。

我們完成了。