基本上我要做的是实现一个系统,网站上的帖子可以用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")
如果我是对的,这应该有用,对吗?但有没有更好,更标准的方式做这样的事情?
答案 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,
}