簡體   English   中英

Django 1.7 - makemigrations 未檢測到更改

[英]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,則不會執行。 有關更多詳細信息,請參閱文檔中的“向應用程序添加遷移”

這可能是由於以下原因造成的:

  1. 您沒有在settings.pyINSTALLED_APPS列表中添加應用程序(您必須在應用程序文件夾的 apps.py 中添加應用程序名稱或虛線路徑到 AppConfig 的子類,具體取決於您使用的 django 版本) . 參考文檔: INSTALLED_APPS
  2. 這些應用程序中沒有migrations文件夾。 (解決方案:只需創建該文件夾)。
  3. 這些應用程序的migrations文件夾中沒有__init__.py文件。 (解決方案:只需創建一個名為init .py的空文件)
  4. app 文件夾中沒有__init__.py文件。 (解決方案:只需創建一個名為__init__.py的空文件)
  5. 您的應用中沒有models.py文件
  6. 您在models.py中的 Python 類(應該是模型)不繼承django.db.models.Model
  7. 您在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 類中添加的屬性具有相同標題的屬性方法。

  1. 刪除名稱與您要添加的屬性相似的方法。
  2. manage.py makemigrations my_app
  3. manage.py 遷移 my_app
  4. 重新添加方法。

這是一個愚蠢的錯誤,但是在模型類的字段聲明行末尾有一個額外的逗號,會使該行無效。

當您復制粘貼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,但由於某種原因,我從未進行過初始遷移。

以下為我工作:

  1. 將應用名稱添加到 settings.py
  2. 使用'python manage.py makemigrations'
  3. 使用'python manage.py migrate'

為我工作:Python 3.4、Django 1.10

像我這樣不喜歡遷移的人可以使用以下步驟。

  1. 刪除您要同步的更改。
  2. 運行python manage.py makemigrations app_label進行初始遷移。
  3. 在進行更改之前運行python manage.py migrate以創建表。
  4. 粘貼您在第一步中刪除的更改。
  5. 運行 2. 和 3. 步驟。

如果您混淆了這些步驟中的任何一個,請閱讀遷移文件。 更改它們以更正您的架構或刪除不需要的文件,但不要忘記更改下一個遷移文件的依賴項部分;)

我希望這對將來的人有所幫助。

您要檢查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文件夾運行makemigrationsmigrate
它仍然說:沒有要申請的遷移。

我去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的模式遷移),它可能會幫助他們:)

也許這可以幫助某人,我有同樣的問題。

我已經使用序列化程序類和視圖創建了兩個表。 所以當我想更新時,我遇到了這個錯誤。

我按照以下步驟操作:

  1. 我做了.\manage.py makemigrations app
  2. 我執行了.\manage.py migrate
  3. 我刪除了我的models.py的兩個表
  4. 我從序列化程序和視圖類中刪除了對我的表的所有引用。
  5. 我執行了第1步和2步。
  6. 我只在models.py中檢索了我的更改
  7. 我再次執行了第5步。
  8. 我恢復了所有更改。

如果您正在使用 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
  1. 刪除您要同步的更改。
  2. 運行 python manage.py makemigrations app_label 進行初始遷移。
  3. 在進行更改之前運行 python manage.py migrate 以創建表。
  4. 粘貼您在第一步中刪除的更改。
  5. 運行 2. 和 3. 步驟

添加了這個答案,因為上面沒有其他可用的對我有用。

就我而言,發生了更奇怪的事情( 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不要刪除它

有時/不知何故你會遇到 django 知道遷移已經應用的情況,當你運行遷移時它會說“未檢測到任何變化”,在這種情況下請按照以下步驟操作:

  1. 從遷移表中刪除最后一次遷移

    從 django_migrations 中刪除 id =

  2. 從遷移文件夾中刪除你最后的遷移文件在此處輸入圖像描述

  3. 運行遷移,它應該可以工作

    django-admin 管理.py makemigrations django-admin 管理.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM