[英]Django 1.7 - makemigrations not detecting changes - managed models
[英]Django 1.7 - makemigrations not detecting changes
正如標題所說,我似乎無法進行遷移。
該應用程序最初低於 1.6,因此我知道最初不會進行遷移,實際上,如果我運行python manage.py migrate
我會得到:
Operations to perform:
Synchronize unmigrated apps: myapp
Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
Creating tables...
Installing custom SQL...
Installing indexes...
Running migrations:
No migrations to apply.
如果我對myapp
中的任何模型進行更改,它仍會按預期顯示未遷移。
但是如果我運行python manage.py makemigrations myapp
我得到:
No changes detected in app 'myapp'
我運行命令的內容或方式似乎無關緊要,它永遠不會檢測到應用程序有更改,也不會向應用程序添加任何遷移文件。
有沒有什么辦法可以強制應用程序進行遷移,並基本上說“這是我的工作基礎”或其他任何東西? 或者我錯過了什么?
如果有幫助的話,我的數據庫是 PostgreSQL。
如果您要從您在 django 1.6 中制作的現有應用程序進行更改,那么您需要執行文檔中列出的一個前置步驟(正如我發現的那樣):
python manage.py makemigrations your_app_label
文檔並沒有明確表明您需要將 app 標簽添加到命令中,因為它告訴您要做的第一件事是python manage.py makemigrations
這將失敗。 當您在 1.7 版本中創建應用程序時,初始遷移已完成,但如果您來自 1.6,則不會執行。 有關更多詳細信息,請參閱文檔中的“向應用程序添加遷移” 。
這可能是由於以下原因造成的:
settings.py
的INSTALLED_APPS
列表中添加應用程序(您必須在應用程序文件夾的 apps.py 中添加應用程序名稱或虛線路徑到 AppConfig 的子類,具體取決於您使用的 django 版本) . 參考文檔: INSTALLED_APPSmigrations
文件夾。 (解決方案:只需創建該文件夾)。migrations
文件夾中沒有__init__.py
文件。 (解決方案:只需創建一個名為init .py的空文件)__init__.py
文件。 (解決方案:只需創建一個名為__init__.py
的空文件)models.py
文件models.py
中的 Python 類(應該是模型)不繼承django.db.models.Model
models.py
中定義模型時存在一些語義錯誤注意:一個常見的錯誤是在.gitignore
文件中添加migrations
文件夾。 從遠程倉庫克隆時,本地倉庫中將缺少migrations
文件夾和/或__init__.py
文件。 這會導致問題。
遷移文件應該包含在 repo 中。 在這里閱讀。 如果您的團隊經常遇到遷移問題,您可以考慮忽略遷移文件,如下所示:
我建議通過將以下行添加到.gitignore
文件來 gitignore 遷移文件
*/migrations/*
!*/migrations/__init__.py
請記住,不建議按照 django 文檔 gitignore 遷移文件
好的,看起來我錯過了一個明顯的步驟,但發布這個以防其他人也這樣做。
升級到 1.7 時,我的模型變得不受管理( managed = False
) - 我之前將它們設置為True
但似乎它已恢復。
刪除該行(默認為 True)然后運行makemigrations
立即創建了一個遷移模塊,現在它正在工作。 makemigrations
不適用於非托管表(事后看來很明顯)
我的解決方案未在此處介紹,因此我將其發布。 我一直在為一個項目使用syncdb
只是為了讓它運行起來。 然后,當我嘗試開始使用 Django 遷移時,它首先偽造了它們,然后會說它是“好的”,但數據庫沒有發生任何事情。
我的解決方案是只刪除我的應用程序的所有遷移文件,以及django_migrations
表中應用程序遷移的數據庫記錄。
然后我只是做了一個初始遷移:
./manage.py makemigrations my_app
其次是:
./manage.py migrate my_app
現在我可以毫無問題地進行遷移。
同意@furins。 如果一切似乎都井井有條,但出現了這個問題,請檢查是否有任何與您嘗試在 Model 類中添加的屬性具有相同標題的屬性方法。
這是一個愚蠢的錯誤,但是在模型類的字段聲明行末尾有一個額外的逗號,會使該行無效。
當您復制粘貼def時會發生這種情況。 來自遷移,它本身被定義為一個數組。
雖然也許這會對某人有所幫助:-)
也許我為時已晚,但您是否嘗試在您的應用程序中有一個帶有__init__.py
文件的migrations
文件夾?
也許這會對某人有所幫助。 我正在使用嵌套應用程序。 project.appname 和我實際上在 INSTALLED_APPS 中有 project 和 project.appname。 從 INSTALLED_APPS 中刪除項目允許檢測到更改。
答案在 Django 1.7 中的 cdvv7788 Migrations 的這篇 stackoverflow 帖子上
如果這是您第一次遷移該應用程序,您必須使用:
manage.py makemigrations myappname 一旦你這樣做了,你可以這樣做:
manage.py migrate 如果您的應用程序在數據庫中,修改了它的模型並且它沒有更新 makemigrations 上的更改,那么您可能還沒有遷移它。 將您的模型改回其原始形式,運行第一個命令(使用應用程序名稱)並遷移......它會偽造它。 完成后,將更改恢復到模型上,運行 makemigrations 並再次遷移,它應該可以工作。
我遇到了完全相同的麻煩,並且上述操作完美無缺。
我已將 django 應用程序移至 cloud9,但由於某種原因,我從未進行過初始遷移。
以下為我工作:
為我工作:Python 3.4、Django 1.10
像我這樣不喜歡遷移的人可以使用以下步驟。
python manage.py makemigrations app_label
進行初始遷移。python manage.py migrate
以創建表。如果您混淆了這些步驟中的任何一個,請閱讀遷移文件。 更改它們以更正您的架構或刪除不需要的文件,但不要忘記更改下一個遷移文件的依賴項部分;)
我希望這對將來的人有所幫助。
您要檢查INSTALLED_APPS
列表中的settings.py
並確保所有帶有模型的應用程序都在其中列出。
在項目文件夾中運行makemigrations
意味着它將更新與項目的settings.py
中包含的所有應用程序相關的所有表。 包含它后, makemigrations
將自動包含該應用程序(這可以節省大量工作,因此您不必為項目/站點中的每個應用程序運行makemigrations app_name
)。
以防萬一您有一個未被 makemigrations 識別的特定字段:檢查您是否有同名的屬性。
例子:
field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)
# ... later
@property
def field(self):
pass
該屬性將“覆蓋”字段定義,因此makemigrations
不會識別更改
添加這個答案是因為只有這種方法對我有幫助。
我刪除了migrations
文件夾運行makemigrations
和migrate
。
它仍然說:沒有要申請的遷移。
我去migrate
文件夾並打開最后創建的文件,
評論我想要的遷移(它被檢測到並在那里輸入)
並再次運行migrate
。
這基本上是手動編輯遷移文件。
僅當您了解文件內容時才執行此操作。
確保您的模型不是abstract
的。 我實際上犯了這個錯誤,並且花了一段時間,所以我想我會發布它。
重命名舊遷移文件夾后,您是否使用了schemamigration my_app --initial
? 試試看。 可能會奏效。 如果沒有 - 嘗試重新創建數據庫並進行同步數據庫遷移。 它對我有用...
在我的情況下,我需要將我的模型添加到定義我的模型的模型文件夾的_init _.py 文件中:
from myapp.models.mymodel import MyModel
有同樣的問題確保你在models.py中定義的任何類,你必須繼承models.Model類。
class Product(models.Model):
title = models.TextField()
description = models.TextField()
price = models.TextField()
我錯誤地從我的項目目錄中刪除了migrations
文件夾。
解決方案是在migrations
文件夾中創建__init__.py
文件,然后,
python manage.py makemigrations
python manage.py migrate
我遇到了同樣的問題,不得不兩次運行 makemigrations 以及各種奇怪的行為。 事實證明,問題的根源在於我正在使用一個函數在我的模型中設置默認日期,因此每次我運行 makemigrations 時,遷移都會檢測到變化。 這個問題的答案讓我走上了正確的道路: 避免 makemigrations to re-create date field
我最近將 Django 從 1.6 升級到 1.8,並且幾乎沒有為它們提供應用程序和遷移。 我使用 south 和schemamigrations
在 Django 1.6 中創建遷移,它在 Django 1.8 中被刪除。
當我在升級后添加新模型時, makemigrations
命令沒有檢測到任何更改。 然后我嘗試了@drojf(第一個答案)建議的解決方案,它運行良好,但未能應用假初始遷移( python manage.py --fake-initial
)。 我這樣做是因為我的表(舊表)已經創建。
最后這對我有用,從models.py中刪除了新模型(或模型更改),然后必須刪除(或重命名以進行安全備份)所有應用程序的遷移文件夾並為所有應用程序運行python manage.py
makemigrations,然后python manage.py migrate --fake-initial
。 這就像一個魅力。 一旦為所有應用程序創建了初始遷移並進行了假初始遷移,然后添加新模型並遵循常規的makemigrations
過程並在該應用程序上進行遷移。 現在檢測到更改,一切正常。
我只是想在這里分享它,如果有人遇到同樣的問題(他們的應用程序有schemamigrations
的模式遷移),它可能會幫助他們:)
也許這可以幫助某人,我有同樣的問題。
我已經使用序列化程序類和視圖創建了兩個表。 所以當我想更新時,我遇到了這個錯誤。
我按照以下步驟操作:
.\manage.py makemigrations app
.\manage.py migrate
models.py
的兩個表1
步和2
步。models.py
中檢索了我的更改5
步。如果您正在使用 Pycharm,本地歷史非常有幫助。
也許這會對某人有所幫助。
我已經刪除了我的models.py
和預期makemigrations
來創建DeleteModel
語句。
記得刪除*.pyc
文件!
./manage makemigrations
./manage migrate
遷移跟蹤對數據庫的更改,因此如果您從非托管更改為托管,您需要確保您的數據庫表與您正在處理的模型相關是最新的。
如果您仍處於開發模式,我個人決定刪除我的 IDE 以及與我的模型相關的 django_migrations 表中的遷移文件,然后重新運行上述命令。
請記住:如果您的遷移以 IDE 中的 _001 和數據庫中的 _003 結尾。 Django 只會查看您是否有以 _004 結尾的遷移以進行任何更新。
2(代碼和數據庫遷移)鏈接並協同工作。
快樂編碼。
您可能需要使用以下命令偽造初始遷移
python manage.py migrate --fake-initial
添加了這個答案,因為上面沒有其他可用的對我有用。
就我而言,發生了更奇怪的事情( Django 1.7 版本),在我的models.py中,我的文件末尾有一個“額外”行(它是一個空行),當我執行python manage.py makemigrations
命令結果是: “未檢測到更改”。
為了解決這個問題,我刪除了我的models.py文件末尾的這個“空白行” ,我再次運行了命令,一切都得到了修復,並且檢測到了對models.py所做的所有更改!
首先,此解決方案適用於在 heroku 服務器上部署期間遇到相同問題的人,我也遇到了同樣的問題。
要部署,有一個強制性步驟是在 settings.py 文件中添加 django_heroku.settings(locals()) 。
更改:當我將上面的行更改為 django_heroku.settings(locals(), databases=False) 時,它完美地工作。
我遇到了這個問題,命令
python manage.py makemigrations
一旦我保存了對文件所做的更改,就和我一起工作。
原因之一可能是您沒有在 admin.py 文件中注冊模型。 首先在 admin.py 文件中注冊您的模型,然后進行遷移。
將你的應用加載到 settings.py 和 py.\manage.py makemigrations
INSTALLED_APPS = [ 'appname' ]
對我來說,我刪除了 env 文件夾env\Lib\site-packages\django\contrib\auth\migrations\...
上的遷移文件,但保留__init__.py
不要刪除它
首先確保您的應用已注冊
INSTALLED_APPS
您的項目 settings.py 文件。 如果您的遷移不適用於您的項目,您可以運行
python manage.py makemigrations {app_name}
然后申請遷移命令
python manage.py migrate
要么
python manage.py migrate {app_name}
如果應用了遷移但未應用遷移命令,請檢查您的數據庫,將有一個名為“django_migrations”的表。 然后檢查你新添加的遷移文件是否存在於這個表中。 如果存在,請刪除此行並再次應用於遷移命令。 希望它會起作用。
添加我的 2c,因為這些解決方案都不適合我,但這確實......
我剛剛運行manage.py squashmigrations
並刪除了舊的遷移(django.migrations 數據庫表中的文件和行)。
這在最后一個遷移文件中留下了這樣的一行:
replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]
這顯然使 Django 感到困惑並導致奇怪的行為:運行manage.py makemigrations my_app
將重新創建初始遷移,就好像不存在一樣。 刪除replaces...
行解決了問題!
python manage.py makemigrations accounts 'accounts'的遷移:accounts\migrations\0001_initial.py - 創建模型 Customer - 創建模型標簽 - 創建模型 Product - 創建模型 Order
注意:這里的“accounts”是我的應用名稱
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.