我有一个带有字段is_deleted的模型,现在我希望除了传递给.filter和.filter_by的任何过滤参数之外,所有形式的查询都要通过is_deleted = False过滤。
在Django中,我通常会覆盖管理器并添加自己的过滤,但我需要SQLAlchemy的帮助。
更新
我最终做了以下事情:
class CustomQuery(Query):
def __new__(cls, *args, **kwargs):
if args and hasattr(args[0][0], "is_deleted"):
return Query(*args, **kwargs).filter_by(is_deleted=False)
else:
return object.__new__(cls)
session = scoped_session(sessionmaker(query_cls=CustomQuery))
它有效,但如果我以后有更多字段,我想我必须添加更多条件,必须有一种方法在模型级别上执行此操作。
答案 0 :(得分:10)
答案 1 :(得分:2)
这是一个非常古老的问题,所以我确信 OP 解决了他们的问题,但由于它仍未得到解答(在 2021 年),以下是我们将自定义查询类应用于所有模型的方法:
class CustomQuery(Query): ...
class BaseModel(Model):
__abstract__ = True
query_class = CustomQuery
...
那么任何实现 BaseModel 的模型显然都会继承这种行为:
class MyModel(BaseModel):
__tablename__ = 'my_model'
....
请注意,在我们的示例中,并非所有表都遵循软删除模式(我们不关心每个表的历史记录)。在这里,您可以实现一个使用默认查询类的单独 BaseModel。
class ImmutableBaseModel(Model):
__abstract__ = True
query_class = CustomQuery
...
class MutableBaseModel(Model):
__abstract__ = True
如果您发现自己在这里但尚未阅读它,请查看 Miguel Grinberg 撰写的关于实施 soft delete pattern 和 accompanying repo
的精彩博文