openerp经典收藏 字段定义详解(转载)
字段定义详解
原文地址:
http://shine-it.net/index.php/topic,2159.0.html
http://blog.sina.com.cn/s/blog_57ded94e01014pm9.html
boolean:
布尔型(true, false)
integer:
整数。
float:
浮点型,如 'rate' : fields.float('Relative Change rate',digits=(12,6)),
digits定义整数部分和小数部分的位数。
char:
字符型,size属性定义字符串长度。
text:
文本型,没有长度限制。
date:
日期型
datetime:
日期时间型
binary:
二进制型
function:
函数型,该类型的字段,字段值由函数计算而得,不存储在数据表中。其定义格式为:
fields.function(fnct,
arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None,
obj=None, method=False, store=True)
·
type 是函数返回值的类型。
·
method
为True表示本字段的函数是对象的一个方法,为False表示是全局函数,不是对象的方法。如果method=True,obj指定method的对象。
·
fcnt 是函数或方法,用于计算字段值。如果method = true, 表示fcnt是对象的方法,其格式如下:def fnct(self, cr, uid,
ids, field_name, args, context),否则,其格式如下:def fnct(cr, table, ids, field_name,
args, context)。ids是系统传进来的当前存取的record
id。field_name是本字段名,当一个函数用于多个函数字段类型时,本参数可区分字段。args是'arg=None'传进来的参数。
·
fcnt_inv 是用于写本字段的函数或方法。如果method = true, 其格式是:def fcnt_inv(self, cr, uid, ids,
field_name, field_value, args, context),否则格式为:def fcnt_inv(cr, table, ids,
field_name, field_value, args, context)
·
fcnt_search 定义该字段的搜索行为。如果method = true, 其格式为:def fcnt_search(self, cr, uid, obj,
field_name, args),否则格式为:def fcnt_search(cr, uid, obj, field_name,
args)
·
store 表示是否希望在数据库中存储本字段值,缺省值为False。不过store还有一个增强形式,格式为
store={'object_name':(function_name,['field_name1','field_name2'],priority)}
,其含义是,如果对象'object_name'的字段['field_name1','field_name2']发生任何改变,系统将调用函数function_name,函数的返回结果将作为参数(arg)传送给本字段的主函数,即fnct。
selection:
下拉框字段。定义一个下拉框,允许用户选择值。如:'state':
fields.selection((('n','Unconfirmed'),('c','Confirmed')),'State',
required=True),这表示state字段有两个选项('n','Unconfirmed')和('c','Confirmed')。
one2one:
一对一关系,格式为:fields.one2one(关联对象Name, 字段显示名, ...
)。在V5.0以后的版本中不建议使用,而是用many2one替代。
many2one:
多对一关系,格式为:fields.many2one(关联对象Name, 字段显示名, ...
)。可选参数有:ondelete,可选值为"cascade"和"null",缺省值为"null",表示one端的record被删除后,many端的record是否级联删除。
one2many:
一对多关系,格式为:fields.one2many(关联对象Name, 关联字段, 字段显示名, ... ),例:'address':
fields.one2many('res.partner.address', 'partner_id', 'Contacts')。
many2many:
多对多关系。例如:
'category_id':fields.many2many('res.partner.category','res_partner_category_rel','partner_id','category_id','Categories'),
表示以多对多关系关联到对象res.partner.category,关联表为'res_partner_category_rel',关联字段为'partner_id'和'category_id'。当定义上述字段时,OpenERP会自动创建关联表为'res_partner_category_rel',它含有关联字段'partner_id'和'category_id'。
reference:
引用型,格式为:fields.reference(字段名, selection, size, ... )。其中selection是:
1)返回tuple列表的函数,或者 2)表征该字段引用哪个对象(or
model)的tuples列表。reference字段在数据库表中的存储形式是(对象名,ID),如(product.product,3)表示引用对象product.product(数据表product_product)中id=3的数据。reference的例子:
def _links_get(self, cr, uid):
cr.execute('select object,name from res_request_link order
by priority')
return cr.fetchall()
...
'ref':fields.reference('Document Ref 2', selection=_links_get,
size=128),
...
上例表示,字段ref可以引用哪些对象类型的resource,可引用的对象类型从下拉框选择。下拉框的选项由函数_links_get返回,是(object,name)对的列表,如[("product.product","Product"),
("account.invoice","Invoice"), ("stock.production.lot","Production Lot")]
。
related:
关联字段,表示本字段引用关联表中的某字段。格式为:fields.related(关系字段,引用字段,type, relation, string,
...),关系字段是本对象的某字段(通常是one2many or
many2many),引用字段是通过关系字段关联的数据表的字段,type是引用字段的类型,如果type是many2one or many2many,
relation指明关联表。例子如下:
'address': fields.one2many('res.partner.address',
'partner_id', 'Contacts'),
'city':fields.related('address','city',type='char',
string='City'),
'country':fields.related('address','country_id',type='many2one',
relation='res.country', string='Country'),
这里,city引用address的city字段,country引用address的country对象。在address的关联对象res.partner.address中,country_id是many2one类型的字段,所以type='many2one',
relation='res.country'。
property:
属性字段,下面以具体例子解说property字段类型。
'property_product_pricelist':
fields.property('product.pricelist', type='many2one',
relation='product.pricelist',string="Sale Pricelist", method=True,
view_load=True, group_name="Pricelists Properties")
这个例子表示,本对象通过字段'property_product_pricelist'多对一(type='many2one')关联到对象product.pricelist(relation='product.pricelist')。和many2one字段类型不同的是,many2one字段会在本对象中创建数据表字段'property_product_pricelist',property字段类型不会创建数据表字段'property_product_pricelist'。property字段类型会从数据表ir.property中查找name='property_product_pricelist'(即字段定义中的'product.pricelist'加上前缀property,并将"."替换成"_"作为name)且company_id和本对象相同的记录,从该记录的value字段(value字段类型为reference)查得关联记录,如(product.pricelist,1),表示本对象的resource多对一关联到对象product.pricelist的id=1的记录。也就是说,property字段类型通过ir.property间接多对一关联到别的对象。
property字段类型基本上和many2one字段类型相同,但是有两种情况优于many2one字段。其一是,例如,当有多条记录通过ir.property的name='property_product_pricelist'的记录关联到记录(product.pricelist,1),此时,如果希望将所有关联关系都改成关联到记录(product.pricelist,2)。如果是many2one类型,不写代码,很难完成此任务,是property字段的话,只要将ir.property中的value值(product.pricelist,1)改成(product.pricelist,2),则所有关联关系都变了。修改ir.property的value值可以在系统管理下的菜单Configuration
-->
Properties中修改。其二是,例如,同一业务伙伴,但希望A公司的用户进来看到的该业务伙伴价格表为pricelistA,B公司的用户进来看到的该业务伙伴价格表为pricelistB,则many2one类型达不到该效果。property类型通过ir.property中的记录关联时加上了company_id的条件,因此可以使得不同公司的员工进来看到不同的关联记录。
由于property类型通过ir.property关联,因此,每个property类型的字段都必须在ir.property中有一条关联记录。这可以在安装时导入该条记录,参考代码如下:
<record model="ir.property"
id="property_product_pricelist">
<field
name="name">property_product_pricelist</field>
<field name="fields_id"
search="[('model','=','res.partner'),
('name','=','property_product_pricelist')]"/>
<field name="value"
eval="'product.pricelist,'+str(list0)"/>
</record>
字段定义的参数
字段定义中可用的参数有,
change_default,readonly,required,states,string,translate,size,priority,domain,invisible,context,selection。
change_default:别的字段的缺省值是否可依赖于本字段,缺省值为:False。例子(参见res.partner.address),
'zip': fields.char('Zip', change_default=True, size=24),
这个例子中,可以根据zip的值设定其它字段的缺省值,例如,可以通过程序代码,如果zip为200000则city设为“上海”,如果zip为100000则city为“北京”。
readonly:
本字段是否只读,缺省值:False。
required:
本字段是否必须的,缺省值:False。
states:
定义特定state才生效的属性,格式为:{'name_of_the_state':
list_of_attributes},其中list_of_attributes是形如[('name_of_attribute', value),
...]的tuples列表。例子(参见account.transfer):
'partner_id': fields.many2one('res.partner', 'Partner',
states={'posted':[('readonly',True)]}),
string:
字段显示名,任意字符串。
translate:
本字段值(不是字段的显示名)是否可翻译,缺省值:False。
size:
字段长度。
priority:
domain:
域条件,缺省值:[]。在many2many和many2one类型中,字段值是关联表的id,域条件用于过滤关联表的record。例子:
'default_credit_account_id':
fields.many2one('account.account', 'Default Credit Account',
domain="[('type','!=','view')]"),
本例表示,本字段关联到对象('account.account')中的,type不是'view'的record。
invisible:
本字段是否可见,即是否在界面上显示本字段,缺省值True。
selection:
只用于reference字段类型,参见前文reference的说明。

1.对于字段定义我看到fields.py里面还有个
integer_big 在ORM里面对应的是'int8',不过好像没有过多的介绍了,在其他模块里面也不见到使用
平时我们的在PostgreSQL里面的integer虽然也够长的了..
integer 4 字节 常用的整数 -2147483648 到 +2147483647
不过好像真没见过使用
2.selection:他也有function的store属性,作用也是在数据库里面保存这一字段,不过就算不显式写这个属性也会保存的...代码addons\account_voucher\account.py。另外一个问题就是function的store=true有没有意义呢,不是每次读取这个function就会执行里面的方法,那么还储存在数据库里面有什么作用?
3.change_default:貌似有bug曾经测试过,如果一个view里面设了两个字段为change_default就不出来了。
4.related:这个字段在之前partner源码分析的时候看过,继承自function,就像一个partner对应多个address,他会默认取第一个作为在partner tree里面显示出来的。
5.关于property,我看不明白这段代码
<field name="value" eval="'product.pricelist,'+str(list0)"/>
这个list0什么意思呢?
----------------------------------------------------------------------------------------------------------------------
谢谢 Joshua的补充!
> 另外一个问题就是function的store=true有没有意义呢,不是每次读取这个function就会执行里面的方法,那么还储存在数据库里面有什么作用?
我的理解是store=true可以将每次函数计算的结果存储到数据库中,这样有两个好处,一是便于DBA从数据库查看数据;二是非OpenERP的软件可以直接访问数据库共享数据。另外补充一点,fcnt_inv不限于写入本对象的数据表,更经常的情形是写入别的对象,甚至同时写入多个对象的数据表。
> <field name="value" eval="'product.pricelist,'+str(list0)"/>
前文说过,value字段类型为reference,即形如(product.pricelist,1)的值。这一行就是计算value的值,形如(product.pricelist,list0),list0(经导入后其值是数字)是引用的product.pricelist中的一条记录的id,如下。
<record id="list0" model="product.pricelist">
<field name="name">Default Purchase Pricelist</field>
<field name="type">purchase</field>
</record>
也就是说,在<field name="value" eval="'product.pricelist,'+str(list0)"/>之前,必须先有上述导入id="list0"的代码行。
----------------------------------------------------------------------------------------------------------------------
关于field.function我有其他问题,例如
sale这个模块里面的
'amount_untaxed': fields.function(_amount_all, method=True, digits=(16, int(config['price_accuracy'])), string='Untaxed Amount',
store = {
'sale.order': (lambda self, cr, uid, ids, c={}: ids, ['order_line'], 10),
'sale.order.line': (_get_order, ['price_unit', 'tax_id', 'discount', 'product_uom_qty'], 10),
},
multi='sums'),
_get_order
def _get_order(self, cr, uid, ids, context={}):
result = {}
for line in self.pool.get('sale.order.line').browse(cr, uid, ids, context=context):
result[line.order_id.id] = True
return result.keys()
问题来了上面的代码是在sale.order里面的,他是根据sale.order.line的变化。而触发调不调用 _amount_all。但是_get_oeder里面的ids究竟是从何而来呢?是自动对应这个sale.order的sale.order.line吗?这里的_amount_all是任意一个sale.order.line变化就会触发,还是某个sale.order的sale.order.line变化才促发呢?
----------------------------------------------------------------------------------------------------------------------
这个问题太深入了,俺没深入调查源代码,只是凭经验回答。_get_order里面的ids从界面上来,是界面上当前Order的order.line的ids。因此,当前界面上的sale.order的任意一个 sale.order.line的变化,将会触发_amount_all的调用。
----------------------------------------------------------------------------------------------------------------------
sale.order.line有个比较讨厌的地方就是,他有单独的menu。这样用户可能不在订单header界面进去而是直接修改订单行。
----------------------------------------------------------------------------------------------------------------------
估计这个store参数就是为了解决这个问题的
openerp经典收藏 字段定义详解(转载)的更多相关文章
- openerp经典收藏 对象定义详解(转载)
对象定义详解 原文地址:http://shine-it.net/index.php/topic,2159.0.htmlhttp://blog.sina.com.cn/s/blog_57ded94e01 ...
- Solr系列三:solr索引详解(Schema介绍、字段定义详解、Schema API 介绍)
一.Schema介绍 1. Schema 是什么? Schema:模式,是集合/内核中字段的定义,让solr知道集合/内核包含哪些字段.字段的数据类型.字段该索引存储. 2. Schema 的定义方式 ...
- openerp经典收藏 深入理解对象(转载)
深入理解对象(转载) 原文地址:http://shine-it.net/index.php/topic,2159.0.htmlhttp://blog.sina.com.cn/s/blog_57ded9 ...
- 【转载】C++宏定义详解
摘自:http://blog.chinaunix.net/uid-21372424-id-119797.html C++宏定义详解 2011-02-14 23:33:24 分类: C/C++ ...
- 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)
如约而至,Java 10 正式发布! 3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...
- malloc 与 free函数详解<转载>
malloc和free函数详解 本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...
- ABAP程序系统字段中英文详解
SY-SUBRC: 系统执行某指令后,表示执行成功与否的变量,’0’ 表示成功SY-DBLNT: 被处理过的记录的笔数 SY-UNAME: 当前使用者登入SAP的USERNAME;SY-DATUM: ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- (转)MySQL字段类型详解
MySQL字段类型详解 原文:http://www.cnblogs.com/100thMountain/p/4692842.html MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间 ...
随机推荐
- MVC框架 - 捆绑
捆绑和缩小是两个性能改进提高应用程序在请求负载时的技术.目前大多数的主流浏览器限制每个主机同时连接到六个数量.这意味着,在一个时间,所有的其他请求将被浏览器排队. 启用捆绑和缩小 为使捆绑和缩小MVC ...
- 新手教程之使用Xib自定义UITableViewCell
新手教程之使用Xib自定义UITableViewCell 前言 首先:什么是UITableView?看图 其次:什么是cell? 然后:为什么要自定cell,UITableView不是自带的有cell ...
- Java学习笔记——内部类及其调用方法
一.static内部类的static方法 public class Test0719_Inner_Test { public static void main(String[] args) { //s ...
- TaskUtil多线程与定时任务
package com.taoban.util; /** * 执行单次任务或定时任务工具类(用于减少new Thread()和new Timer()的使用) */ public class Tas ...
- LearnMVC5-AddAModel
本人是MVC新手,将从微软官网学习MVC并将看过的英文文档翻译成中文,由于本人英文水平不好,有翻译不准确.错误的地方万望指出,我看到后将会在第一时间修改.另外也希望这一系列文章能为后来者起到引导作用. ...
- java 远程调试
在java 命令上加入 -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y suspend=y 配置的端口时候要保证没有被占用
- AngularJs指令(一)
AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋.最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用 ...
- Java多线程之锁
首先是synchronized 关键字 他可以用于声明方法,也可以用于申明代码块.我们看看三个例子: public class SynchronizedDemo1 { public synchroni ...
- C++之算法题模板
main.cpp: #include <iostream>#include <vector>#include <cstring>#include <cstdi ...
- 关于GrideView Item点击后出现错乱重叠的情况
我在一个搜索页做了一个筛选信息的功能 大概思路如下:在根布局中用Include 引入一个筛选框(如图), 然后把边距设置为 android:layout_marginBottom="-250 ...