web-dev-qa-db-ja.com

Django 1.9-makemigrations-変更は検出されませんでした

Makemigrationsコマンドを使用して既存のアプリ内に移行を作成しようとしましたが、「変更は検出されませんでした」と出力されます。

通常、startappコマンドを使用して新しいアプリを作成しますが、作成時にこのアプリに使用しませんでした。

デバッグ後、migrationsパッケージ/フォルダーがアプリにないため、移行を作成していないことがわかりました。

フォルダが存在しない場合、または何かが足りない場合にフォルダを作成する方が良いでしょうか?

90
Dilraj

アプリの初期移行を作成するには、makemigrationsを実行し、アプリ名を指定します。移行フォルダーが作成されます。

./manage.py makemigrations <myapp>

アプリを最初にINSTALLED_APPSに含める必要があります(settings.py内)。

167
Alasdair

Djangoがmakemigrationsコマンドの実行中に移行対象を検出しない理由は複数あります。

  1. 移行フォルダーアプリに移行パッケージが必要です。
  2. INSTALLED_APPSアプリをINSTALLED_APPS .dictで指定する必要があります
  3. Verbosity冗長性のためにmakemigrations -v 3を実行して開始します。これにより、問題が明らかになります。
  4. フルパスINSTALLED_APPSでは、フルモジュールアプリ設定パス「apply.apps.MyAppConfig」を指定することをお勧めします
  5. -settings正しい設定ファイルが設定されていることを確認したい場合があります:manage.py makemigrations --settings mysite.settings
  6. アプリ名を指定しますmanage.py makemigrations myappにアプリ名を明示的に入力します-これはアプリのみの移行を絞り込みます問題の切り分けに役立ちます。
  7. モデルメタモデルメタに正しいapp_labelがあることを確認してください

  8. デバッグDjangodebug Djangoコアスクリプト。 makemigrationsコマンドは非常に簡単です。 pycharmで行う方法 。それに応じてスクリプト定義を変更します(例:makemigrations --traceback myapp

複数のデータベース:

  • Db RouterDjango dbルーターを使用する場合、ルータークラス(カスタムルータークラス)はallow_syncdbメソッドを実装する必要があります。

makemigrationsは常にモデル変更の移行を作成しますが、allow_migrate()がFalseを返す場合、

28
user1134422

私の問題(および解決策)は、上記の問題とはまだ異なっていました。

models.pyファイルを使用していませんでしたが、modelsディレクトリーを作成し、そこにmy_model.pyファイルを作成し、そこにモデルを配置しました。 Djangoは私のモデルを見つけることができなかったので、適用する移行がないことを書きました。

私の解決策は、my_app/models/__init__.pyファイルに次の行を追加しました:from .my_model import MyModel

この質問に対する多くの回答を読んだことがありますが、多くの場合、他の方法でmakemigrationsを実行するだけです。しかし、私にとっては、問題はモデルのMetaサブクラスにありました。

label = <app name>apps.pyファイル、models.pyviews.pyなどの横にある)と言うアプリ構成があります。万一、メタクラスにアプリラベルと同じラベルが付いていない場合(たとえば、1つの大きすぎるアプリを複数のアプリに分割しているため)、変更は検出されません(有用なエラーメッセージもまったくありません)。それで、私のモデルクラスには次のものがあります:

class ModelClassName(models.Model):

    class Meta:
        app_label = '<app name>' # <-- this label was wrong before.

    field_name = models.FloatField()
    ...

ここでDjango 1.10を実行しています。

25
onekiloparsec

これはコメントですが、おそらく答えになるはずです。

アプリ名がsettings.py INSTALLED_APPSにあることを確認してください。そうしないと、何をしても、移行が実行されません。

INSTALLED_APPS = [
    'Django.contrib.admin',
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',

    'blog',
]

次に実行します:

./manage.py makemigrations blog
11
surfer190

アプリ間の特定の競合を処理できるため、./manage.py makemigrations./manage.py makemigrations <myapp>よりも優れている場合があります。

これらの機会は静かに発生し、恐ろしいNo changes detectedメッセージの本当の意味を理解するのに数時間のswearingが必要です。

したがって、次のコマンドを使用することをお勧めします。

./manage.py makemigrations <myapp1> <myapp2> ... <myappN>

7
raratiru

Djangoの外部からテーブルをコピーしましたが、Metaクラスはデフォルトで「managed = false」に設定されていました。例えば:

class Rssemailsubscription(models.Model):
    id = models.CharField(primary_key=True, max_length=36)
    ...
    area = models.FloatField('Area (Sq. KM)', null=True)

    class Meta:
        managed = False
        db_table = 'RSSEmailSubscription'

MangedをTrueに変更することで、makemigrationは変更を取り入れ始めました。

5
Dan Cogswell

ここに記載されていない別の問題があり、それが私を夢中にさせました。

class MyModel(models.Model):
    name = models.CharField(max_length=64, null=True)  # works
    language_code = models.CharField(max_length=2, default='en')  # works
    is_dumb = models.BooleanField(default=False),  # doesn't work

おそらくコピー&ペーストからの1行で、末尾の「、」がありました。 is_dumbを含む行は、「./ manage.py makemigrations」を使用したモデル移行を作成しませんが、エラーもスローしませんでした。 「」を削除した後、期待どおりに機能しました。

コピー&ペーストするときは注意してください:-)

4
yvess

私はこれを行うことでその問題を解決しました:

  1. 「db.sqlite3」ファイルを消去します。 問題ここでは、現在のデータベースが消去されるため、再度作成する必要があります。
  2. 編集したアプリの移行フォルダー内で、最後に更新されたファイルを消去します。最初に作成されたファイルは「0001_initial.py」であることを忘れないでください。たとえば、新しいクラスを作成し、「makemigrations」および「migrate」手順で登録すると、「0002_auto_etc.py」という新しいファイルが作成されました。消して.
  3. pycache」フォルダー(migrationsフォルダー内)に移動し、ファイル「0002_auto_etc.pyc」を消去します。
  4. 最後に、コンソールに移動して「python manage.py makemigrations」と「python manage.py migrate」を使用します。

私はこれが古い質問であることを知っていますが、私は一日中この同じ問題と戦い、私の解決策は簡単なものでした。

私のディレクトリ構造は次のようなものでした...

apps/
   app/
      __init__.py
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

そして、私が問題を抱えていたモデルまでの他のすべてのモデルは、main_appに登録されていたINSTALLED_APPSからインポートされた別の場所にインポートされていたので、すべてがうまくいったのは幸運でした。

しかし、他のどこにもインポートされていない新しいモデルファイルを最終的に追加したときに、INSTALLED_APPSではなく各appのみをapp_sub*に追加したため、Djangoは完全に無視しました。

私の修正は、このように各appのベースディレクトリにmodels.pyファイルを追加することでした...

apps/
   app/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app_sub1/
           __init__.py
           models.py
      app_sub2/
           __init__.py
           models.py
      app_sub3/
           __init__.py
           models.py
   app2/
      __init__.py
      models.py <<<<<<<<<<--------------------------
      app2_sub1/
           __init__.py
           models.py
      app2_sub2/
           __init__.py
           models.py
      app2_sub3/
           __init__.py
           models.py
    main_app/
      __init__.py
      models.py

次に、from apps.app.app_sub1 import *などを各appレベルのmodels.pyファイルに追加します。

Bleh ...これを理解するのにSO時間がかかり、どこにも解決策が見つかりませんでした... Googleの結果のページ2に行きました。

これが誰かを助けることを願っています!

1
Tim

あなたが持つことができる非常に馬鹿げた問題は、あなたのモデルで2つのclass Metaを定義することです。その場合、makemigrationsの実行時に最初の変更は適用されません。

class Product(models.Model):
    somefield = models.CharField(max_length=255)
    someotherfield = models.CharField(max_length=255)

    class Meta:
        indexes = [models.Index(fields=["somefield"], name="somefield_idx")]

    def somefunc(self):
        pass

    # Many lines...

    class Meta:
        indexes = [models.Index(fields=["someotherfield"], name="someotherfield_idx")]
1
nbeuchat

解決策は、アプリをINSTALLED_APPSに含める必要があることです。

私はそれを逃し、私はこの同じ問題を見つけました。

アプリ名の移行を指定した後、移行が成功しました

INSTALLED_APPS = [
    'Django.contrib.admin',
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
    'boards',
]

私が最後にボードについて言及したことに注意してください。これは私のアプリ名です。

1
sradha
  1. アプリがsettings.pyのinstalled_appsに記載されていることを確認してください
  2. モデルクラスがmodels.Modelを拡張していることを確認してください
0
Amandeep Singh

INSTALLED_APPS = [

'blog.apps.BlogConfig',
'Django.contrib.admin',
'Django.contrib.auth',
'Django.contrib.contenttypes',
'Django.contrib.sessions',
'Django.contrib.messages',
'Django.contrib.staticfiles',

]

「blog.apps.BlogConfig」を確認してください(これは、アプリを移行するためにsettings.pyに含まれています)

次に、python3 manage.py makemigrationsブログまたはアプリ名を実行します

0
Piyush Chandra

polls.apps.PollsConfigINSTALLED_APPSsetting.pyに追加する必要があります

0
Kitty

まず、アプリがsetting.pyのInstalled_appに登録されていることを確認してください。その後、上記の答えは完全に正常に機能します。

0
Arjjun