Flask-SQLAlchemy-一种具有两种不同关系的模型

时间:2019-08-22 02:37:54

标签: python flask-sqlalchemy

我有三种模型:角色,用户和帖子。角色->用户是一对多,而用户->发布是一对多。当我只有用户和帖子时,一切正常。但是,我的网站将需要不同程度的授权。

class Role(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    users = db.relationship('User', backref='role', lazy=True)


class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    role_id = db.Column(db.Integer, db.ForeignKey('role.id'), nullable=False)
    posts = db.relationship('Post', backref='author', lazy=True)


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

这是我收到的错误消息:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) 
no such column: user.role_id

谢谢!

1 个答案:

答案 0 :(得分:1)

您无需显式定义role_id字段-Role中定义的关系(以及您指定的backref参数)已经在{{1 }}个对象。 (SQLAlchemy documentation around backrefs可能对您有所帮助。)

这样,如果您有一个实例化的User对象User,则应该能够通过u获取有关用户角色的详细信息(这将为您提供一个{{1} }实例),角色ID为u.role

因此,您的完整模型定义集只需要看起来像这样:

Role

如果执行此操作,则对于u.role.id对象class Role(db.Model): id = db.Column(db.Integer, primary_key=True) users = db.relationship('User', backref='role', lazy=True) class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) posts = db.relationship('Post', backref='author', lazy=True) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) ,您可以将帖子作者的角色ID作为Post获得(例如)。