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)
如果我理解正确的话,您正在寻找一种根据特定模型过滤掉用户的方法。因为在您的示例中,另一种方式是多余的 - 每个用户只有一个部门,因此无需过滤该用户的部门。为了实现这一点,我将使用模型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)
| 归档时间: |
|
| 查看次数: |
4231 次 |
| 最近记录: |