Makemigrationsコマンドを使用して既存のアプリ内に移行を作成しようとしましたが、「変更は検出されませんでした」と出力されます。
通常、startapp
コマンドを使用して新しいアプリを作成しますが、作成時にこのアプリに使用しませんでした。
デバッグ後、migrations
パッケージ/フォルダーがアプリにないため、移行を作成していないことがわかりました。
フォルダが存在しない場合、または何かが足りない場合にフォルダを作成する方が良いでしょうか?
アプリの初期移行を作成するには、makemigrations
を実行し、アプリ名を指定します。移行フォルダーが作成されます。
./manage.py makemigrations <myapp>
アプリを最初にINSTALLED_APPS
に含める必要があります(settings.py内)。
Djangoがmakemigrations
コマンドの実行中に移行対象を検出しない理由は複数あります。
INSTALLED_APPS
.dictで指定する必要がありますmakemigrations -v 3
を実行して開始します。これにより、問題が明らかになります。INSTALLED_APPS
では、フルモジュールアプリ設定パス「apply.apps.MyAppConfig」を指定することをお勧めしますmanage.py makemigrations --settings mysite.settings
manage.py makemigrations myapp
にアプリ名を明示的に入力します-これはアプリのみの移行を絞り込みます問題の切り分けに役立ちます。モデルメタモデルメタに正しいapp_label
があることを確認してください
デバッグDjangodebug Djangoコアスクリプト。 makemigrationsコマンドは非常に簡単です。 pycharmで行う方法 。それに応じてスクリプト定義を変更します(例:makemigrations --traceback myapp
)
allow_syncdb
メソッドを実装する必要があります。makemigrationsは常にモデル変更の移行を作成しますが、allow_migrate()がFalseを返す場合、
私の問題(および解決策)は、上記の問題とはまだ異なっていました。
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.py
、views.py
などの横にある)と言うアプリ構成があります。万一、メタクラスにアプリラベルと同じラベルが付いていない場合(たとえば、1つの大きすぎるアプリを複数のアプリに分割しているため)、変更は検出されません(有用なエラーメッセージもまったくありません)。それで、私のモデルクラスには次のものがあります:
class ModelClassName(models.Model):
class Meta:
app_label = '<app name>' # <-- this label was wrong before.
field_name = models.FloatField()
...
ここでDjango 1.10を実行しています。
これはコメントですが、おそらく答えになるはずです。
アプリ名が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
アプリ間の特定の競合を処理できるため、./manage.py makemigrations
が./manage.py makemigrations <myapp>
よりも優れている場合があります。
これらの機会は静かに発生し、恐ろしいNo changes detected
メッセージの本当の意味を理解するのに数時間のswearing
が必要です。
したがって、次のコマンドを使用することをお勧めします。
./manage.py makemigrations <myapp1> <myapp2> ... <myappN>
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は変更を取り入れ始めました。
ここに記載されていない別の問題があり、それが私を夢中にさせました。
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」を使用したモデル移行を作成しませんが、エラーもスローしませんでした。 「」を削除した後、期待どおりに機能しました。
コピー&ペーストするときは注意してください:-)
私はこれを行うことでその問題を解決しました:
私はこれが古い質問であることを知っていますが、私は一日中この同じ問題と戦い、私の解決策は簡単なものでした。
私のディレクトリ構造は次のようなものでした...
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に行きました。
これが誰かを助けることを願っています!
あなたが持つことができる非常に馬鹿げた問題は、あなたのモデルで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")]
解決策は、アプリをINSTALLED_APPSに含める必要があることです。
私はそれを逃し、私はこの同じ問題を見つけました。
アプリ名の移行を指定した後、移行が成功しました
INSTALLED_APPS = [
'Django.contrib.admin',
'Django.contrib.auth',
'Django.contrib.contenttypes',
'Django.contrib.sessions',
'Django.contrib.messages',
'Django.contrib.staticfiles',
'boards',
]
私が最後にボードについて言及したことに注意してください。これは私のアプリ名です。
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ブログまたはアプリ名を実行します
polls.apps.PollsConfig
をINSTALLED_APPS
のsetting.py
に追加する必要があります
まず、アプリがsetting.pyのInstalled_appに登録されていることを確認してください。その後、上記の答えは完全に正常に機能します。