一昨日のアプリを作る段階で、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) でないといけないのね。