Flask 如何使用检查列表中是否存在值的过滤器进行查询?
Flask how to query with a filter that checks whether a value is present in a list?
我正在构建一个错误跟踪器,这样每个用户可以有多个项目,每个项目可以记录多个错误。我希望用户能够看到自上次登录以来他们所有项目中报告了多少新错误。
我将其构建为具有用户模型、项目模型和错误模型。我将这三个模型及其相关列包括在下面:
class Users(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key = True, nullable = False)
# ...
last_login = db.Column(db.DateTime, nullable = False)
# AS PARENT
owned_projects = db.relationship('Projects', backref="project_owner")
class Projects(db.Model):
id = db.Column(db.Integer, primary_key = True, nullable = False)
# ...
# AS CHILD
owner = db.Column(db.Integer, db.ForeignKey('users.id'))
# AS PARENT
bugs = db.relationship('Bugs', backref = 'containing_project')
class Bugs(db.Model):
id = db.Column(db.Integer, primary_key = True)
# ...
status = db.Column(db.String(20))
report_date = db.Column(db.DateTime, index = True, default = dt.datetime.now())
# AS CHILD
project = db.Column(db.Integer, db.ForeignKey('projects.id'))
要过滤 Bugs 查询以查找自用户上次登录以来报告的错误,我可以执行类似 Bugs.query.filter(Bugs.report_date > current_user.last_login)
的过滤器。这显示了所有用户的所有错误,但我在构建查询以将其过滤为仅显示用户拥有的项目中的错误时遇到了问题。
.filter(Bugs.containing_project in current_user.owned_projects)
returns“”,但我不知道如何使用它。我阅读了有关 .contains 的内容,但方向错误,current_user.owned_projects.contains(Bugs.project)
不起作用。
我也尝试了 .filter(Bugs.containing_project.owner == current_user.id)
,但出现错误“AttributeError:与 Bugs.containing_project 关联的 'InstrumentedAttribute' 对象和 'Comparator' 对象都没有属性 'owner' ".
我现在能想到的唯一选择是遍历每个错误以找到属于用户拥有的项目的错误,但这在性能方面将是噩梦。肯定有 .in
方法或类似的方法吗?
请告知我如何实现这一点,在此先感谢!
此代码无效?
.filter(Bugs.containing_project.any(Projects.id.in_([ proj['id'] for proj in current_user.owned_projects])
我引用了这个网站。
SQLAlchemy: filter by membership in at least one many-to-many related table
而且,如果我的回答效果不佳,此站点可能会对您有所帮助。
SQLAlchemy how to filter by children in many to many
我正在构建一个错误跟踪器,这样每个用户可以有多个项目,每个项目可以记录多个错误。我希望用户能够看到自上次登录以来他们所有项目中报告了多少新错误。
我将其构建为具有用户模型、项目模型和错误模型。我将这三个模型及其相关列包括在下面:
class Users(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key = True, nullable = False)
# ...
last_login = db.Column(db.DateTime, nullable = False)
# AS PARENT
owned_projects = db.relationship('Projects', backref="project_owner")
class Projects(db.Model):
id = db.Column(db.Integer, primary_key = True, nullable = False)
# ...
# AS CHILD
owner = db.Column(db.Integer, db.ForeignKey('users.id'))
# AS PARENT
bugs = db.relationship('Bugs', backref = 'containing_project')
class Bugs(db.Model):
id = db.Column(db.Integer, primary_key = True)
# ...
status = db.Column(db.String(20))
report_date = db.Column(db.DateTime, index = True, default = dt.datetime.now())
# AS CHILD
project = db.Column(db.Integer, db.ForeignKey('projects.id'))
要过滤 Bugs 查询以查找自用户上次登录以来报告的错误,我可以执行类似 Bugs.query.filter(Bugs.report_date > current_user.last_login)
的过滤器。这显示了所有用户的所有错误,但我在构建查询以将其过滤为仅显示用户拥有的项目中的错误时遇到了问题。
.filter(Bugs.containing_project in current_user.owned_projects)
returns“current_user.owned_projects.contains(Bugs.project)
不起作用。
我也尝试了 .filter(Bugs.containing_project.owner == current_user.id)
,但出现错误“AttributeError:与 Bugs.containing_project 关联的 'InstrumentedAttribute' 对象和 'Comparator' 对象都没有属性 'owner' ".
我现在能想到的唯一选择是遍历每个错误以找到属于用户拥有的项目的错误,但这在性能方面将是噩梦。肯定有 .in
方法或类似的方法吗?
请告知我如何实现这一点,在此先感谢!
此代码无效?
.filter(Bugs.containing_project.any(Projects.id.in_([ proj['id'] for proj in current_user.owned_projects])
我引用了这个网站。
SQLAlchemy: filter by membership in at least one many-to-many related table
而且,如果我的回答效果不佳,此站点可能会对您有所帮助。
SQLAlchemy how to filter by children in many to many