是否可以使用额外属性标记elixir / sqlalchemy字段/列?

时间:2012-09-20 18:12:43

标签: properties tags sqlalchemy python-elixir

我想在我的实体中将某些列标记为可搜索 - 理想情况下,以每列为基础以干净的方式标记。是否可以“标记”或向类中的列定义添加属性?在代码的其他地方,我希望能够获取可在任何实体上搜索的列,而不知道它是专门的类。

例如:

class Foo(Entity):
  bar = Field(Integer, default = -1, searchable = True)

..

if foo.bar.searchable:
  # do something

显然上面的例子不起作用 - 但是有办法做到这一点吗?我不是这方面的专家,几天的搜索/文档拖网都没有发现任何帮助。

1 个答案:

答案 0 :(得分:0)

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