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

时间:2019-05-29 13:37:56

标签: python flask flask-sqlalchemy

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

到目前为止,我还没有解决此问题的方法,只能使用users.query.all()

查询所有用户数据。

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

我如何通过ID查询与用户有关系的所有角色,部门,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')

1 个答案:

答案 0 :(得分:1)

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

这是一个由两个模型组成的示例:

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)

现在您可以使用:

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

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

user = User.query.filter_by(id=1).first()
print(user.department) # prints Department object