2011-04-30 9 views
17

私は2つのテーブル、NewsFiles持っている:file_id_logo FKEYを追加した後SQLAlchemy循環依存性 - それをどのように解決するか?

# unrelated columns removed 
class News(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    file_id_logo = db.Column(db.Integer, db.ForeignKey('files.id')) 
    logo = db.relationship('File', lazy=False) 

class File(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    news_id = db.Column(db.Integer, db.ForeignKey('news.id')) 
    news = db.relationship('News', lazy=False, backref=db.backref('files')) 

を、SQLAlchemyのはCircularDependencyErrorを上げました。 の関係で既にpost_update=Trueを試しましたが、何も変更されませんでした。

これを解決する適切な方法は何ですか?

次の場合

は(場合には、それが重要)が可能です:

  • ファイルがないか、正確に一つのニュースが割り当てられていません。
  • ファイルにニュースがない場合は、ロゴとして参照されているこのファイルのニュースもありません。
  • 1つのニュースに対して複数のファイルが存在することがありますが、これらのファイルのうち1つのみがlogoになることがあります。
  • ニュースにlogoがある場合、参照されるファイルにもこのニュースがnewsとして表示されます。

答えて

22

use_alter - 制約がCREATE TABLE/DROP TABLEステートメントから外部的に生成/削除されるべきであることを示すために、基礎となるForeignKeyConstraintに渡されます。詳細はクラスのコンストラクタを参照してください。

http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html?highlight=use_alter#foreign-key-api-constructs

+0

エラーを取り除くためにうまく働いたが、それはいくつかの他の関係を壊しました。だから私は単にForeignKeyを取り除くことにしました。答え自体が正しいので、とにかくそれを受け入れる。 – ThiefMaster

+2

@ThiefMasterおそらく、あなたの関係にprimaryjoinを設定する必要があります.2つのテーブルの間に複数のリレーション/バックリファレンスがある場合、結合方向を判断できません。 – letitbee

+0

ここに情報があります:http://docs.sqlalchemy.org/en/rel_0_8/core/constraints.html –