2009-05-06 15 views
51

私は少数のユーザーからなる小さなWebサイトを持っています。私のモデル(したがってテーブル)の1つにフィールドを追加したいのですが、問題はsyncdbです既存のモデルに触れ、モデル/テーブルにこのフィールドを追加する方法を理解しようとしていますが、全体を再作成する必要はありません。既存のDjangoモデルにフィールドを追加する

例:

class Newspaper(models.Model): 
    name = models.CharField() 

class UserProfile(models.Model): 
    user = models.ForeignKey(user, unique=True) 
    reads = models.ManyToManyField(Newspaper) 

今、私は、ユーザープロファイルを壊すことなくNewspaperモデルにURLフィールド(blank=True)を追加したいと思います。

アイデア?

答えて

38

これを行うための組み込みの方法はありません。しかし、あなたのためにそれを行うサードパーティのプロジェクトがたくさんあります。 2つの主要なものはSouthdjango-evolutionと呼ばれていますが、他にもさまざまなものがあります(私が関与しているものも含めて)。

私は間違いなく南部をお勧めします - それは本当に素敵な機能の数があり、本当にうまく機能します。

+0

私は自分のデータベースを快適に変更することをお勧めします。特に、新しい列や制約を追加するなどの単純な操作の場合は特にそうです。これは、DjangoのORMについてだけでなく、リレーションシップデータベースの基礎を学ぶのに最適な方法です。そして、あなたがいったんどのように知っていれば、それは簡単です。 –

+4

あなたはどのように教えてくれますか? – holmeswatson

+1

そして数年後、南はDjangoコアの一部になりました。 –

18

あなたが使用して、新しいフィールドのSQLを取得試みることができる:appnameはアプリケーションの名前であなたの新聞のクラスの命である

manage.py sql appname 

ALTER TABLEを使用してappname_newspaperテーブルに手動でフィールドを追加することができます。 Djangoは移行をサポートしていないので、私はこれをDjangoで直接行う方法を知らない。

+0

小さなコメント:あなたはこのルートを行けば、私はあなたのDjangoアプリケーションで(列の初期値を埋める)移行の実行をお勧めします初期化されていない値を探し、それをオンザフライで実行するだけです。別のアプリケーションからそれらを埋めようとすると、キャッシュに関する問題が発生する可能性があります。 –

1

2015の答え:

を実行し、以下:

python manage.py makemigrations 
python manage.py migrate 
関連する問題