我在 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类型字段。?
另一种组合,而不是MODEL,NAME ..?
答案 0 :(得分:9)
在OpenERP框架中,fields.reference
字段是伪 - many2one
关系,可以定位多个模型。也就是说,除了外键之外,它还包含目标模型的名称,因此每个值都可以属于不同的表。用户界面首先显示用户选择目标文档模型的下拉列表,然后是many2one
窗口小部件,用户可以从中选择该模型中的特定文档。
您当然可以在自己的模块中使用它,但它始终以这种方式运行。
这通常用于附加各种文档(类似于附件,除了目标是另一个记录而不是文件)。它也用在一些需要附加到不同类型记录的内部OpenERP模型中,例如可能属于任何记录的属性(fields.property
值)。
fields.reference
constructor有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
字段一样 - 这是规则的主要例外; - )< / LI>