gpt4 book ai didi

python - SQLAlchemy 默认过滤器

转载 作者:太空狗 更新时间:2023-10-29 17:07:41 25 4
gpt4 key购买 nike

我有一个带有字段 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))

它有效,但如果我以后有更多字段,我想我将不得不添加更多条件,必须有一种方法可以在模型级别执行此操作。

最佳答案

这是一个非常古老的问题,所以我确信 OP 解决了他们的问题,但由于它仍然没有答案(在 2021 年),下面是我们如何将自定义查询类应用于所有模型:

  1. 如上所述定义自定义查询
class CustomQuery(Query): ...
  1. 然后将此查询类设置为基础模型类的查询属性:
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

关于python - SQLAlchemy 默认过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10262938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com