2016-01-13 47 views
2

我有這樣一個模型(簡化了相關性):如何安全地從模型中刪除ForeignKey字段?

class Director(models.Model): 

    first_name = models.CharField(max_length=200) 
    last_name = models.CharField(max_length=200) 
    user_account = models.ForeignKey(User, null=True, blank=True) 

我剛剛意識到user_account必須OneToOneField,而不是ForeignKey。進行這種改變基本上意味着刪除現有的user_account字段和創建新的。

問題是,我在過去糟糕的經驗,當與ForeignKey字段混淆。更糟的是,我已經在數據庫中創建了一對Director對象,ForeignKey鏈接到User對象。

我的問題是如何刪除並最終更改user_account字段而不會導致運行時錯誤?

其他上下文:我正在使用Django 1.9和PostgreSQL。

回答

1

我認爲你可以使用django migrations來做到這一點。

  1. 添加OneToOne場指着模型User,你可能需要添加related_name了點。

  2. 創建一個將該字段應用於數據庫的遷移。

  3. 創建數據遷移並將ForeignKey的值從user_account複製到每個Director的新字段。

  4. 刪除模型中的user_account字段,然後創建另一個遷移以將刪除應用於數據庫。

+0

當你說「創建一個數據遷移」,你的意思是像'migrations.RunPython()'? – vleong

+0

https://docs.djangoproject.com/en/1.9/topics/migrations/#data-migrations –

+0

很好的答案。這是我爲將來參考所做的遷移(https://gist.github.com/vleong2332/612fa933ffff8aa64063) – vleong

2

ForeignKeyOneToOneField是一樣的,除了OneToOneField具有獨特的約束。嘗試更改模型中的字段並運行makemigrations - 我認爲Django應該足夠聰明,能夠創建所需的遷移。

在開始之前,您需要確保沒有多個指向同一用戶的director實例,因爲這不是一對一允許的。

+0

如果我確實有多個director指向同一個用戶,@ShangWang的答案是正確的。 – vleong

1

ForeignKeyOneToOneField之間沒有太大的區別。如果直接運行更改模型字段類型,您的數據將不會受到干擾。更改模型字段類型後,運行makemigrations