OpenERP中的元编程
这里有一种开发 OpenERP 的方法
class stock_incoterms(osv.osv):
_name = "stock.incoterms"
_description = "Incoterms"
_columns = {
'name': fields.char('Name', size=64, required=True),
'code': fields.char('Code', size=3, required=True),
'active': fields.boolean('Active'),
}
_defaults = {
'active': lambda *a: True,
}
stock_incoterms()
这是一个典型的 OpenERP 模型,它对应数据库中的表名 stock_incoterms。
列属性定义了这个表的列。
默认属性则为每一列定义了默认值。
我有几个问题:
如何在 Python 中实现这个?
当运行 stock_incoterms() 时,OpenERP 会读取这个模型,并根据定义的列生成表格。
之后,假设我在这个表中创建了一条记录,然后我想要获取这个类的模型,比如说
stock_incoterm = stock_incoterms.get(1)(这是数据库中的记录 ID)
现在我可以访问
stock_incoterm.name
stock_incoterm.code
........
这种定义模型的方式有点像元编程,但我不知道如何用 Python 来写。
有没有人能给我一些详细的指导或者关于 Python 中元编程的好链接?
2 个回答
先研究一下OpenERP的代码吧,接下来就可以开始了 :-)
还有一些不错的入门点,包括:
- Logilab的 yams 模块和 Cubicweb 的ORM
- 像 SQLAlchemy 这样的工具
简单来说,就是利用Python的自省功能来了解用户提供的对象结构,然后把这个结构转换成比如SQL表的定义和查询。
在 yams
中,用户定义的类会创建一个 Schema
对象,这些类是从 EntityType
这个类派生出来的,而 EntityType
有一个叫 metadefinition
的元类。这个元类会列出 EntityType
的类属性,并把它们存储在不同的内部字段中。然后可以使用 schema2sql
模块把这个模式序列化成一组SQL表。
OpenERP开发者手册是一个很好的起点。如果你想添加一个叫做stock_incoterm的新表格,我建议你先创建一个新的模块,然后把这个表格加进去,同时再添加一个界面和一些菜单项来编辑这个表格。开发者手册里有一章专门讲模块开发的内容。
一旦你把这些都设置好了,访问记录字段的代码大概会是这样的:
class stock_incoterms(osv.osv):
# ...
def do_something(self, cr, uid, ids):
for stock_incoterm in self.browse(cr, uid, ids):
name = stock_incoterm.name
# ...