OpenERP fields.reference是什么意思?

Pri*_*ckZ 3 python xml openerp

我在subscription.py类中看到了这段代码.它为用户提供了选择和多个字段.我在openerp文档和其他模块中找到了,但我从未找到任何细节或其他样本

这是它的观点

fields.reference

这是与该字段相关的代码

'doc_source': fields.reference('Source Document', required=True, selection=_get_document_types, size=128),
Run Code Online (Sandbox Code Playgroud)

这是选择部分功能代码

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()
Run Code Online (Sandbox Code Playgroud)

我需要知道; 我们可以创建自己的fields.reference类型字段吗?

另一个组合而不是MODEL,NAME ..?

odo*_*ony 9

在OpenERP框架中,fields.reference字段是many2one可以针对多个模型的伪关系.也就是说,除了外键之外,它还包含目标模型的名称,因此每个值都可以属于不同的表.用户界面首先呈现用户选择目标文档模型的下拉列表,然后是many2one用户可以从该模型中选择特定文档的小部件.您当然可以在自己的模块中使用它,但它始终以这种方式运行.

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

fields.reference 构造需要3个主要参数:

'doc': fields.reference('Field Label', selection, size)
Run Code Online (Sandbox Code Playgroud)

其中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字段的关系- 这是规则的主要例外;-)