SQLAlchemy与许多可能的不同模型的一对多关系

时间:2017-03-20 01:16:07

标签: python python-3.x flask sqlalchemy flask-sqlalchemy

基本上我要做的是实现一个系统,网站上的帖子可以用emojis做出反应。对这些帖子的评论也可以作出反应。为了保持清洁,我想为帖子和评论的所有反应制作一个表,因为它们基本上是相同的。所以基本上我有两个一对多关系,反应表总是“很多”,两个可能的模型/表充当“一个”。这基本上就是我想要做的事情,使用Flask-SQLAlchemy:

class Reaction(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(32), nullable=False) # The emoji code in format ":thumbsup:"
    user_id = db.Column(db.Integer, db.ForeignKey("user.id")) # The user reacting
    post_id = db.Column(db.Integer, db.ForeignKey("post.id"), nullable=True)
    comment_id = db.Column(db.Integer, db.ForeignKey("comment.id"), nullable=True)

class Post(db.Model):
    ....
    reactions = db.relationship("Reaction", lazy="dynamic", cascade="all, delete-orphan")

class Comment(db.Model):
    ....
    reactions = db.relationship("Reaction", lazy="dynamic", cascade="all, delete-orphan")

如果我是对的,这应该有用,对吗?但有没有更好,更标准的方式做这样的事情?

1 个答案:

答案 0 :(得分:0)

您可以使用Single Table Inheritance(维基百科)。 SQLAlchemy通过功能Mapping Class Inheritance Hierarchies(SQLAlchemy docs)支持此功能。

对于单表继承,您可以在表上创建一个字段来区分post和comment并创建多个模型类,并将特定参数传递给Mapper(通过__mapper_args__属性),以便SQLAlchemy到使用这个"鉴别器列"知道每行代表哪种类型的对象。

实施例

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # columns omitted
    post_type = db.Column(db.Integer)

    __table_name__ = 'post_or_comment'
    __mapper_args__ = {
        'polymorphic_on': post_type,
        'polymorphic_identity': 1,
    }

class Comment(Post):
    __mapper_args__ = {
        'polymorphic_identity': 2,
    }