2015-09-27 40 views
1

使用Django 1.7.5,我更改了User_Profile通過添加一個字段:Django的遷移壞了,也不會忘記一被刪列

school = models.CharField(max_length = 255, blank=True, default="") 

然後,

$ python manage.py makemigrations 

沒問題。它添加了該字段。接下來,

$ python manage.py migrate 

給我:

django.db.utils.IntegrityError: mathbreakers_userprofile__new.school may not be NULL 

嗯哦。那麼,通過將字段default=""blank=True嘗試不同的事情後,什麼都不起作用。忘記它,我刪除了該領域,並將模型恢復到一切正常時的樣子。模型看起來像以前一樣,我運行makemigrations,它刪除字段(它說)。大!

然而,

$ python manage.py migrate 

仍然導致了同樣的錯誤,抱怨我說,然後刪除該字段。就好像我不能讓django忘記那個領域存在一樣。但它不存在於我的models.py文件中。我該如何解決?那個領域在哪裏?它是否在我的SqlLite中,我應該從那裏手動刪除它?

注意:我已手動刪除損壞的遷移文件,並在更改之前還恢復爲以前的GIT版本。沒有奏效,python manage.py migrate似乎依然被打破..

+0

您以前是否已經擁有該字段,然後進行更改? – dietbacon

回答

2

雖然我不使用南(我認爲),下面解決了我的問題:

Backwards migration with Django South

具體來說,我按照這些步驟:

  • 從models.py
  • 刪除的罪魁禍首場刪除罪魁禍首遷移文件及其.pyc文件同行
  • 回滾遷移到錯誤發生前的數字,例如

$蟒蛇manage.py遷移MY_APP_NAME 0024

運行的遷移:

沒有遷移申請。

雖然最後一步似乎什麼都不做,現在當我運行makemigrations並遷移時,一切正常,沒有錯誤。

0

TL; DR:嘗試編輯app/migrations中的最新遷移.py文件。

我自己也有類似的問題(Django 1.8.6,Postgresql)。我想創建一個現有類的子類,並且想要將一個字段從基類移動到子類。我曾經(我以爲)從父類中刪除了違規字段,但是當我運行python manage.py migrate時,我得到的錯誤消息是,子類中的字段與基類中的相似名稱的字段發生衝突。

我查看了最後一次遷移.py文件(在app/migrations中),並注意到從基類中刪除字段的命令是之後創建子類的命令。所以我編輯了遷移文件(改變了命令的順序),並且python manage.py migrate運行正常。