一昨日のアプリを作る段階で、Flask-SQLAlchemy のモデルでのリレーションシップの作り方を調べたのでメモ。↓ここに書いてある。
cf. One-to-Many Relationships – Flask SQLAlchemy
簡単に言うと、主キーを持つテーブルにリレーションシップを作成して、外部キーを持つテーブルに db.ForeignKey を設定してやる。
次の例では Category と Format が Book に対して1対多リレーションになっている。つまり、Category と Format が主キーを持っていて、Book が外部キーを持っている。
class Book(db.Model): __tablename__ = 'books' id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String) volume = db.Column(db.String) series = db.Column(db.String) series_volume = db.Column(db.String) author = db.Column(db.String) translator = db.Column(db.String) publisher = db.Column(db.String) category_id = db.Column(db.Integer, db.ForeignKey('categories.id')) format_id = db.Column(db.Integer, db.ForeignKey('formats.id')) isbn = db.Column(db.String) published_on = db.Column(db.String) original_title = db.Column(db.String) note = db.Column(db.String) keyword = db.Column(db.String) disk = db.Column(db.String) disposed = db.Column(db.Boolean, default=False) class Category(db.Model): __tablename__ = 'categories' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) books = db.relationship('Book', backref='category', lazy='dynamic') class Format(db.Model): __tablename__ = 'formats' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) books = db.relationship('Book', backref='format', lazy='dynamic')
はじめ、ForeignKey を db.ForeignKey(‘category.id’) とやったらダメだった。モデル名 (category) じゃなくてテーブル名 (categories) でないといけないのね。