与多个模型的一对多关系

时间:2012-04-23 00:20:30

标签: python sqlalchemy flask flask-sqlalchemy

我有一个模型Thing和一个模型ActionThingAction之间存在一对多的关系。但是,我希望能够将Action子类化为(例如)BuildActionHealActionBloodyStupidAction。是否可以使用Flask-SQLAlchemy执行此操作并保持单一的一对多关系?

1 个答案:

答案 0 :(得分:2)

Inheritance Configuration下的SQLAlchemy文档中描述了此问题。如果您的不同子类将共享同一个数据库表,则应使用single table inheritance

代码示例:

class Thing(db.Model):
    __tablename__ = 'thing'
    id = db.Column(db.Integer, primary_key=True)
    actions = db.relationship('Action', backref=db.backref('thing'))

class Action(db.Model):
    __tablename__ = 'action'
    id = db.Column(db.Integer, primary_key=True)
    thing_id = db.Column(db.Integer, db.ForeignKey('thing.id'))
    discriminator = db.Column('type', db.String(50))
    __mapper_args__ = {'polymorphic_on': discriminator}

class BuildAction(Action):
    __mapper_args__ = {'polymorphic_identity': 'build_action'}
    time_required = db.Column(db.Integer)

Action的每个子类都应该继承父类中定义的thing关系。 action.type列描述了表的每一行所代表的子类操作。