【问题标题】:Use Flask-SqlAlchemy to query relationship database使用 Flask-SqlAlchemy 查询关系数据库
【发布时间】:2025-11-24 13:40:01
【问题描述】:

我正在尝试使用 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')

【问题讨论】:

标签: python flask flask-sqlalchemy


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答!
  • 我需要将数据模型显示为树视图。你能建议我怎么做吗?非常感谢!
  • 不完全确定你的意思。您应该使用您尝试过的代码打开一个新问题,我相信您会得到答案!