Skip to main content
 首页 » 编程设计

python之将一个 SQLAlchemy 模型定义为与多个其他模型之一相关联

2025年05月04日14bhlsheji

我正在为自己的问答网站设计数据库,有点类似于Stack Overflow:

  1. 一个“问题”可以有多个“答案”,但一个“答案”只有一个“问题”。
  2. “问题”和“答案”都可以有多个“评论”,但一个“评论”只有一个“问题”或“答案”。

我不知道如何设计这样的数据库。这是我尝试过的:

class Question(db.Model): 
    __tablename__ = 'questions' 
    id = db.Column(db.Integer, primary_key=True) 
    title = db.Column(db.Unicode(64), unique=True) 
    body = db.Column(db.UnicodeText) 
    author_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    answers = db.relationship('Answer', backref='question', lazy='dynamic') 
 
class Answer(db.Model): 
    __tablename__ = 'answers' 
    id = db.Column(db.Integer, primary_key=True) 
    body = db.Column(db.UnicodeText) 
    author_id = db.Column(db.Integer, db.ForeignKey('users.id')) 
    question_id = db.Column(db.Integer, db.ForeignKey('questions.id')) 
 
class Comment(db.Model): 
    __tablename__ = 'comments' 
    id = db.Column(db.Integer, primary_key=True) 
    # post_id = db.Column(db.Integer, db.ForeignKey('')) ??? 

请您参考如下方法:

所以你已经做到了第一点。

您正在寻找的是一般关系。您可以在 sqlalchemy_utils 中找到它包。

from sqlalchemy_utils import generic_relationship 
 
 
class Comment(db.Model): 
    __tablename__ = 'comments' 
    id = db.Column(db.Integer, primary_key=True) 
    object_type = db.Column(db.Unicode(255)) 
    object_id = db.Column(db.Integer) 
    object = generic_relationship(object_type, object_id) 

Docs对于一般关系

基本上它的作用是,它将 object_type 存储为答案或问题,将 object_id 存储为对象的主键。