[解決済み] Django/South を使ってモデルの名前を変更する最も簡単な方法とは?
2022-05-17 05:57:14
質問
南さんのサイト、Google、SOで回答を探したのですが、簡単な方法が見つかりませんでした。
Southを使ってDjangoのモデルの名前を変更したいです。 以下のようなものがあるとします。
class Foo(models.Model):
name = models.CharField()
class FooTwo(models.Model):
name = models.CharField()
foo = models.ForeignKey(Foo)
で、FooをBarに変換したい場合、すなわち
class Bar(models.Model):
name = models.CharField()
class FooTwo(models.Model):
name = models.CharField()
foo = models.ForeignKey(Bar)
シンプルにするために、名前を
Foo
から
Bar
を無視し
foo
のメンバは無視します。
FooTwo
を使うことができます。
Southを使って一番簡単にできる方法は何ですか?
- データ移行はできるかもしれませんが、それはかなり複雑なようです。
-
カスタムマイグレーションを書く、例えば
db.rename_table('city_citystate', 'geo_citystate')
というように、外部キーを修正する必要がありますが、この場合、どのように修正すればよいのかわかりません。 - あなたが知っているより簡単な方法ですか?
どのように解決するのですか?
最初の質問に答えるために、単純なモデル/テーブルの名前の変更は非常に簡単です。コマンドを実行します。
./manage.py schemamigration yourapp rename_foo_to_bar --empty
(更新2:
--auto
の代わりに
--empty
に変更することで、下の警告を回避することができます。 ヒントをくれた@KFBに感謝します)。
古いバージョンの south を使っている場合、以下のように
startmigration
の代わりに
schemamigration
.
次に、マイグレーションファイルを手動で編集して、以下のようにします。
class Migration(SchemaMigration):
def forwards(self, orm):
db.rename_table('yourapp_foo', 'yourapp_bar')
def backwards(self, orm):
db.rename_table('yourapp_bar','yourapp_foo')
これをより簡単に行うには
db_table
Meta オプションを使うだけです。 クラス名とテーブル名が異なるということは、コードを理解し維持することを難しくします。 私は、明快さのためにこのような単純なリファクタリングを行うことを全面的に支持します。
(更新) 実稼働環境でこれを試したところ、移行を適用しようとしたときに奇妙な警告が表示されました。 それは
The following content types are stale and need to be deleted: yourapp | foo Any objects related to these content types by a foreign key will also be deleted. Are you sure you want to delete these content types? If you're unsure, answer 'no'.
私は「いいえ」と答えましたが、何も問題ありませんでした。
関連
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み] pipでインストールしたすべてのパッケージを削除する最も簡単な方法は何ですか?
-
[解決済み】Django Southでの後方移行について
-
[解決済み] Django - Southを使用してモデルフィールドの名前を変更する方法は?
-
[解決済み] モデルとリレーションシップフィールドの名前を変更するためのDjangoマイグレーション戦略
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonによるjieba分割ライブラリ
-
Python百行で韓服サークルの画像クロールを実現する
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。
-
[解決済み] Django - Southを使用してモデルフィールドの名前を変更する方法は?
-
[解決済み】Djangoアプリの名前を変更する方法は?
-
[解決済み] モデルとリレーションシップフィールドの名前を変更するためのDjangoマイグレーション戦略