3

我在subscription.py类中看到了这个代码段。它为用户提供了选择和许多字段。我在 openerp 文档和其他模块中也找到了,但我从未找到任何详细信息或其他示例

这是它的观点

字段参考

这是与该字段相关的代码

'doc_source': fields.reference('Source Document', required=True, selection=_get_document_types, size=128),

这里是选择部分功能代码

def _get_document_types(self, cr, uid, context=None):
    cr.execute('select m.model, s.name from subscription_document s, ir_model m WHERE s.model = m.id order by s.name')
    return cr.fetchall()

我需要知道这一点;我们可以制作自己的 fields.reference 类型的字段吗?

另一种组合而不是模型,名称..?

4

1 回答 1

9

在 OpenERP 框架中,字段是可以针对多个模型fields.reference的伪关系。many2one即除了外键外,它还包含目标模型的名称,这样每个值就可以属于不同的表。用户界面首先呈现一个下拉菜单,用户可以在其中选择目标文档模型,然后是一个many2one小部件,他们可以在其中从该模型中选择特定文档。你当然可以在你自己的模块中使用它,但它总是以这种方式运行。

这通常用于附加各种文档(类似于附件,除了目标是另一条记录而不是文件)。它也用于一些需要附加到不同类型记录的内部 OpenERP 模型中,例如fields.property可能属于任何记录的属性(值)。

构造fields.reference 函数采用 3 个主要参数:

'doc': fields.reference('Field Label', selection, size)

其中selection包含可以从中选择值的文档模型列表(例如,合作伙伴、产品等),其格式与fields.selection声明中的相同。选择值的键必须是模型名称(例如'res.partner')。

从 OpenERP 7.0 开始,size参数应该是None,除非您想特别限制将存储值的数据库字段的大小,这可能是个坏主意。从技术上讲,fields.reference值存储为表单中的文本model.name,id。您将无法在常规 SQL JOIN 中使用这些字段,因此many2one在许多情况下它们的行为与字段不同。

主要 API 调用

  • 当您以编程read()方式获取非空参考值时,您必须将其拆分','以识别目标模型和目标 ID
  • 当您以编程write()方式获取非空引用值时,您需要传递'model.name,id'字符串。
  • 当您search()获取非空引用值时,您需要搜索'model.name,id'字符串(例如在搜索域中)
  • 最后,当您browse()以编程方式通过引用值时,框架将自动取消引用它并像使用常规字段一样遵循关系many2one- 这是该规则的主要例外;-)
于 2013-08-07T09:54:35.093 回答