0

Dotcloudを使用してdjangoアプリをデプロイしています。私はPostgresをDBとして使用しています。

アプリに新しいモデルがあり、dbをフラッシュしてsyncdbしたいと思いました。私がそれをするとき、すべての仕事は見つけます。「Competition」という名前の新しいモデルが管理者に表示されます。

問題は、他のモデルであるMatchがモデルCompetitionのForeignKeyを持っていることです。また、管理者の[一致]に移動すると、次のエラーが発生します。

     DatabaseError at /admin/myproject/match/
     column myproject_match.competition_id does not exist
     LINE 1: ...team_challenger_id", "sportdub_match"."sport_id", "sportdub_...

syncdbが機能しなかった理由について何か考えはありますか?

ご協力ありがとうございました。

編集:私の2つのモデル

     class Competition(models.Model):
       name = models.CharField(max_length=256)
       comp_pic = models.ImageField(upload_to="comp_pics/")

       def __unicode__(self):
           return self.name


     class Match(models.Model):
        team_host = models.ForeignKey(Team, related_name='host_matches')
        team_challenger = models.ForeignKey(Team, related_name= 'challenger_matches')
        sport = models.ForeignKey(Sport)
        competition = models.ForeignKey(Competition)
4

1 に答える 1

1

manage.py syncdb欠落しているテーブルのみが作成されます。テーブルがすでに存在しているが、定義が無効である場合、そのテーブルは更新されません。これはおそらくあなたが経験している問題です。

問題を解決するには、少なくとも3つの方法があります。

  1. 簡単な方法:manage.py resetすべてのテーブルを効果的にドロップ+再作成するために使用します。簡単ですが、もちろんデータは失われます。
  2. 怠惰な方法:インストールdjango_extensionsして使用しますmanage.py sqldiff。データベースの現在の構造と予想される構造の違いが表示されます。sqldiffモデルに準拠するように既存のデータベースを更新できるSQLステートメントがうまく表示されます。その後、SQLシェルでこれらのステートメントを実行できます。
  3. クリーンな方法:southデータベーススキーマの更新を処理するような移行フレームワークを使用します。もちろん、開発の初期段階では、これはやり過ぎです(ローカル開発を行っているときにフィールドを追加/変更/削除するたびにデータベースの移行を記述したくない!)が、プロジェクトの期間が長くなる場合寿命、私は間違いなくチェックアウトすることをお勧めしsouthます。
于 2012-11-28T19:09:34.233 に答える