8

既存のモデルに多対多のフィールドを追加しsyncdb、新しいテーブルを作成することを期待していましたが、そこには何もありません。モデルは次のようになります。

class Author(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()

    def __unicode__(self):
        return "{0} {1}".format(self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

    def __unicode__(self):
        return self.title

実行sql myappすると、新しいテーブルで正しいステートメントが出力されますが、を実行してもこれは反映されませんsyncdbvalidateまた、エラーは返されません。ここで何が問題になるのか誰か知っていますか?またはより良い診断?

4

2 に答える 2

15

syncdbコマンドは、設計上、既存のモデルに対して多対多のテーブルを作成しません。この決定はチケット2229で説明されています。

それはあなたにいくつかの選択肢を残します。

  • Bookモデルにデータがない場合は、テーブルを削除してsyncdbを再実行します。Djangoは、bookテーブルと多対多のテーブルを再作成します。
  • dbshel​​lコマンドを使用し、sqlmyappの出力を使用して多対多の結合テーブルを作成します。
  • Djangoで複数のスキーマ移行を行っている場合は、Southと友達になりましょう。
于 2012-12-24T01:28:53.850 に答える
5

この説明はdjangoのドキュメントで役に立ちました:SchemaEvolution

データベース移行のデファクトスタンダードはDjangoSouthです。

完璧ではありませんが、かなりうまく機能します。移行ファイルを実行する前に、移行ファイルを常にチェック(および必要に応じて編集)して、実際に想定どおりに動作することを確認する必要があります。あなたはここで彼らのチュートリアルをチェックすることができます。

また、実行する場合:

python manage.py inspectdb > somefile.txt

データベース構造がdjangoモデルと一致しているかどうかをすばやく確認できます。

于 2012-12-24T02:46:58.060 に答える