Monkeypatching 有效(至少在 sqlalchemy 声明性模型中,我没有用 Elixir 尝试过),尽管它让您接触到 Monkeypatching 的所有标准问题(主要问题是不能保证您对 bar 的修改将保持不变) . 但它基本上可以工作,如果您的应用程序非常简单,它可能是一个可行的解决方案。
class Foo(Entity):
bar = Field(Integer, default=-1)
bar.searchable = True
如果您的应用程序更复杂,和/或它需要在很长一段时间内保持健壮/可靠/可多次维护,则上述技术不是可行的方法。理想情况下,您希望引入一些其他对象来存储此附加信息,该对象完全在您的控制范围内,而不是受 sqlalchemy 对您的数据模型类所做的所有幕后工作的摆布。
为此,有很多方法可以走。一个简单的选择是创建一个简单的结构,该结构将保存附加信息(布尔“可搜索”属性以及您可能想要添加的任何其他内容),以便您可以在需要时轻松查找。例如,定义一个非常简单的类,它使用嵌套的 dict() 来存储由模型类、字段名称和属性名称索引的任意数量的附加属性。然后创建此类的单个实例,并在整个应用程序中共享它。
设置了这样的结构后,您可以像这样使用它:
if extra_props[foo]['bar']['searchable']:
# do something