【发布时间】:2015-10-22 04:23:05
【问题描述】:
我正在开发一个庞大的代码库,该代码库执行所有数据库交互,如下所示:
ExampleClass.query.all()
其中ExampleClass继承了db.Model的属性,我们的BaseEntity定义如下:
class BaseEntity(object):
deleted = db.Column(db.DateTime, default=None, nullable=True)
... # more columns
现在,当我查询 ExampleClass 的所有条目时,ExampleClass.query.all(),我希望将已删除字段设置为日期的条目,即从系统中删除的条目被排除在外。如果我不必用简单的.filter(deleted != None) 更新整个代码库,那将是理想的选择。我的解决方案是添加一个 SQLAlchemy 事件过滤器:before_compile。文档准确地告诉了我正在搜索的内容:
@event.listens_for(Query, "before_compile", retval=True)
def no_deleted(query):
for desc in query.column_descriptions:
if desc['type'] is ExampleClass:
entity = desc['expr']
query = query.filter(entity.deleted == False)
return query
但是我无法让它工作,我遇到的最后一个错误如下:
AttributeError: 'Mapper' object has no attribute 'deleted'
我使用的库版本有:Flask==0.10.1、Flask-SQLAlchemy==1.0、SQLAlchemy==1.0.6
【问题讨论】:
标签: python-3.x flask sqlalchemy flask-sqlalchemy