0

我想将我的实体中的某些列标记为可搜索——理想情况下,以一种干净的方式,以每列为基础。是否可以“标记”或向类中的列定义添加属性?在代码的其他地方,我希望能够选择可在任何实体上搜索的列,而无需知道它具体是什么类。

例如:

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

..

if foo.bar.searchable:
  # do something

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

4

1 回答 1

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
于 2012-09-20T19:28:49.703 回答