我试着阅读的文档 ,但它是一个有点混乱。
此外,没有store
任何其他字段类型的工作?
我试着阅读的文档 ,但它是一个有点混乱。
此外,没有store
任何其他字段类型的工作?
先回答第二个问题: related
和sparse
领域是两个子类function
所以store
可/应与他们合作,但我没试过。
在背后的想法store
参数是告诉OpenERP的,如果它是好的记忆和保存调用功能,以避免再次调用它的结果。
它是如何工作的,让我们来看看下面的例子:
'order_status': fields.function(
_order_status,
type='char',
method=True,
store= . . . ,
string='Order Status',
),
默认情况下, store
是False
的-这意味着该函数字段将被评估每次请求的记录。
有,但是,另外两个可能的值- True
或dict
的tuple
秒。
store=True,
True
是很容易理解,而只是意味着该值将被计算一次,存储,然后重新计算每一次记录的变化。
store={
'model.table': (function, ['field1', 'field2', ...], priority),
'another_model.table': (some_func, [], priority),
},
该dict
的tuple
s的都有些复杂,以及非常强大的。 有了它,我们可以告诉OpenERP的时候 ,我们要重新计算领域。
键是表,如res.partner
或product.product
; 在这三个项目的元组的第一项是调用的函数,第二项是在关键的表来监控字段列表,最后一个项目是优先级,或序列,处理功能,如果有超过一个1。
一个例子是为了:
store={
'product.product': (_get_product_dependent_ids, ['name','price'], 20),
'res.partner': (_get_partner_dependent_ids, ['login'], 10),
},
工作向后,优先级(每个元组的最后一个项目)告诉我们, res.partner
元组将首先运行,因为它具有较低的优先级。
中间产品领域的列表监控:为res.partner
OpenERP的将监控login
场,并随时login
域改变的OpenERP将调用_get_partner_dependent_ids
; 同样,任何时候, name
或price
的领域product.product
记录被改变,OpenERP的将调用_get_product_dependent_ids
2。
在数组中的第一项是要调用的函数,这是棘手的部分。 这个函数的签名是:
def _get_ids(key_table, cr, uid, ids_of_changed_records, context=None):
需要注意的是key_table
不是self
! 虽然这个功能可能是你的依赖类(例如,一个方法custom.table1
),第一个参数是不是表,但被列为在店里字典中键的表- product.product
或res.partner
在我们的例子3。
这是什么功能,应该怎么做? 它应该返回需要有一个重新计算领域在自定义表中的所有记录ID的列表。
这里是我的功能领域:
'order_status': fields.function(
_order_status,
type='char',
method=True,
store={
'fnx.pd.order': (_get_schedule_ids_for_order, ['state'], 20),
},
我的存储功能:
def _get_schedule_ids_for_order(fnx_pd_order, cr, uid, ids, context=None):
if not isinstance(ids, (int, long)):
[ids] = ids
return [s.id for s in fnx_pd_order.browse(cr, uid, ids, context=context).schedule_ids]
什么字段定义告诉我们,任何时候的state
字段上记录变更fnx.pd.order
, _get_schedule_ids_for_order
将在记录的ID叫fnx.pd.order
是有他们的state
字段改变。
_get_schedule_ids_for_order
查找更改的记录,得到的链接日程记录的ID,并将其返回。
脚注:
在priority
字段进行排序每_get_ids()
函数对表中的每一个领域,而不仅仅是_get_ids()
对单个功能。 这是非常有用的,当一个功能领域依赖于另一个。
如果字段列表为空,则任何修改任何领域将导致调用的函数。
如果你需要在函数内部访问你自己的表,你可以做
self = key_table.pool.get('my_module_name_here.my_table_name_here')