使用Flask-SqlAlchemy查询关系数据库

izn*_*ddd 2 python flask flask-sqlalchemy

我正在尝试使用 Flask-SQLAlchemy 查询数据库中的用户个人资料页面

到目前为止我还没有解决这个问题的方法,只能使用以下方法查询所有用户数据users.query.all()

每个用户都有自己的role_id、department_id、researchfield_id。

如何通过ID查询出所有与User有关系的Role、Department、ResearchField数据?

class User(UserMixin, db.Model):

    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    password_hash = db.Column(db.String(128))
    is_admin = db.Column(db.Boolean, default=False)
    department_id = db.Column(db.Integer, db.ForeignKey('departments.id'))
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    research_id = db.Column(db.Integer, db.ForeignKey('researchfields.id'))

class Department(db.Model):
    __tablename__ = "departments"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(sqlalchemy.types.NVARCHAR(100), unique=True)
    user = db.relationship('User', backref='department',
                                lazy='dynamic')

class Role(db.Model):

    __tablename__ = 'roles'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(sqlalchemy.types.NVARCHAR(100), unique=True)
    users = db.relationship('User', backref='role',
                                lazy='dynamic')


class ResearchField(db.Model):

    __tablename__ = "researchfields"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60), index=True)
    parent_id = db.Column(db.Integer, db.ForeignKey("researchfields.id") , nullable=True)
    users = db.relationship('User', backref='researchfield', lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)

Ada*_*old 6

如果我理解正确的话,您正在寻找一种根据特定模型过滤掉用户的方法。因为在您的示例中,另一种方式是多余的 - 每个用户只有一个部门,因此无需过滤该用户的部门。为了实现这一点,我将使用模型backref提供的方法。SQLAlchemyUser

这是包含两个模型的示例:

from sqlalchemy.orm import backref

class User(UserMixin, db.Model):

    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    password_hash = db.Column(db.String(128))
    is_admin = db.Column(db.Boolean, default=False)
    department_id = db.Column(db.Integer, db.ForeignKey('departments.id'))
    department = db.relationship("Department", backref=backref("users", lazy="dynamic"))

class Department(db.Model):
    __tablename__ = "departments"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(sqlalchemy.types.NVARCHAR(100), unique=True)
Run Code Online (Sandbox Code Playgroud)

现在您可以使用:

department = Department.query.filter_by(id=1).first()
print(department.users.filter_by(is_admin=True).all()) # get all admins with that department
Run Code Online (Sandbox Code Playgroud)

每个用户只有一个部门,因此您可以通过以下方式获取用户所在的部门:

user = User.query.filter_by(id=1).first()
print(user.department) # prints Department object
Run Code Online (Sandbox Code Playgroud)