网站首页 > 技术教程 正文
和大多数框架一样,odoo模型层也是 Odoo技术框架最核心的部分了。了解了它的编写规则,可以说 Odoo的神秘面纱基本也会被掀开一半。
上面这是一段证书管理的 model 代码,下面来详细解释下 model 层各个字段
01
创建模型
创建类继承自 models.Model
_name : 创建 odoo模型内部标志符(数据表名称,名称以_连接存入数据库),必须是全局唯一的
_description: 描述,方便用户的模型记录解释
_inherit : 继承 (设置继承自另外那个表,可以进行字段方法的添加修改)
02
字段类型
可以定义字段的类型
1.Char :
单行文本
name = fields.Char(string=u'单据编号')
2.Text :
多行文本
note = fields.Text(u'备注')
3.Html:
存储为带格式的文本字段
html = fields.Html()
4.Datetime:
日期时间类型
date_order =fields.Datetime(string=u'订单日期')
5.Date
delivery_date = fields.Date(u'交货日期')
6.Selection:
下拉选择列表(前一个参数是存储在数据库的值,后一个参数是前端展示的描述)
type = fields.Selection([ (u'default', u'默认')], string=u'类型', default=u'default')
7.Boolean:
布尔类型
active=fields.Boolean(default=True, string=u'是否归档')
8.Integer:
整型
sequence =fields.Integer(string=u'排序', default=10)
9.Binary:
存储为二进制文件
files=fields.Binary(u'文件',filters='*.xlsx', required=True)
10.Float:
浮点型
amount = fields.Float(string=u'总计')
11.Monetary:
与浮点型类似,但带有货币的特殊处理
price_subtotal = fields.Monetary(compute='_compute_amount', string=u'小计', readonly=True)
12.Many2one:
多对一
order_id = fields.Many2one('sale.order', string=u'销售订单', ondelete='cascade', index=True, copy=False)
13.One2many:
一对多
One2many 是一个一对多的关联字段,与 Many2one 对应
order_line=fields.One2many('sale.order.line', 'order_id', string=u'销售明细',states=READONLY_STATES,copy=True)
14.Many2many:
多对多
一本书可以有多个作者,一个作者可以有多本书class Book(models.Model):
author_ids=fields.Many2many(‘res.partner’, string=‘Authors’)
class Partner(models.Model):
book_ids=fields.Many2many(‘library.book’, string=‘Authored Books’)
03
字段属性
# string 字段显示名label,任意字符串
# help='str' 用于悬挂帮助信息提示
# readonly=True 本字段是否只读,缺省值:False
# required=True 本字段是否必须的,缺省值:False。
# index = True 设置字段创建索引
# select=True 相关联字段下拉列表
# default 设置字段的默认值
name = fields.Char(default="Unknown")
user_id = fields.Many2one('res.users', default=lambda self:self.env.user)
# 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)]}),
# groups 设置权限组访问可见,值为列表形式,元素是组的xml ids(也就是外部标识符)
# copy=False 设置字段不能被复制,普通字段是True, 在 one2many是默认是False
# oldname='field' 当一个字段在新版本重命名了,指定老的字段,老的字段的数据会自动拷贝到新的字段中
# compute 给定一个方法名计算出该字段
# inverse 给定一个方法名反转该字段 (为了在计算字段设置值)
document = fields.Char(compute='_get_document', inverse='_set_document')
def _get_document(self):
for record in self:
with open(record.get_document_path) as f:
record.document = f.read()
def _set_document(self):
for record in self:
if not record.document: continue
with open(record.get_document_path()) as f:
f.write(record.document)
# search 给定一个方法名搜索该字段 (用在计算字段)
upper_name = field.Char(compute='_compute_upper', search='_search_upper')
def _search_upper(self, operator, value):
if operator == 'like':
operator = 'ilike'
return [('name', operator, value)]
# store 设定该字段是否存在数据表中,在用了compute时为False ,其它默认是True
# compute_sudo 设定是否要超级用户来计算该字段,默认是False
# related 序列的字段名,用于关联字段,默认不存数据表中,可以store=True来存,
nickname = fields.Char(related='user_id.partner_id.name', store=True)
这里看出前面定义了user_id字段,这里是接着关联到 user_id这个字段把所要的信息提取出来
# company_dependent 定义该字段是不是公司依赖
# change_default 别的字段的缺省值是否可依赖于本字段,缺省值为:False。
例子(参见res.partner.address) 'zip': fields.char('Zip', change_default=True, size=24),
这个例子中,可以根据zip的值设定其它字段的缺省值,例如,可以通过程序代码,
如果zip为200000则city设为“上海”,如果zip为100000则city为“北京”。
# domain: 域条件,缺省值:[]。在many2many和many2one类型中,字段值是关联表的id,
域条件用于过滤关联表的record。例子: 'default_credit_account_id': fields.many2one('account.account',
'Default Credit Account', domain="[('type','!=','view')]"),
本例表示,本字段关联到对象('account.account')中的,type不是'view'的record。
# context 上下文
# invisible: 本字段是否可见,即是否在界面上显示本字段,缺省值True。
# selection: 只用于reference字段类型,参见前文reference的说明。
# size 只用于Char 设置可最大接收字符数
# translate=true 用于Text Char Html 本字段值(不是字段的显示名)是否可翻译,缺省值:False。
# ondelete 用于关联字段,定义删除方式
# manual
# deprecated=True 当用这个字段,日志会记录警告,主要是版本升级一些过渡字段
# password ="True" 密码星号显示
# nolabel ="1" 隐藏标签
# attr属性 可以定义多条件这段只读显示
# digits 格式化浮点数
<field digits="(14,3)" name="volume" attrs="{readonly:[('type','=','service')]}"
# default_focus 新开窗口光标位置
# Widget 多种部件显示格式 widget="one2many_list"
one2one_list, one2many_list, many2one_list, many2many,Url,Email,Image,float_time,reference
04
ORM装饰器
@api.multi
默认装饰器,如果我们需要自定义方法来对记录集执行一些操作。用这个,方法的逻辑通常包括对 self 的遍历
@api.one
用于操作单条记录(单例),弃用了。用@api.multi,在代码顶部添加一行 self.ensure_one(),来确保操作单条记录
@api.model
类静态方法,self作为模型的引用,无需包含实际记录。注意,不能从用户界面中的按钮使用这种类型的方法。
@api.onchange(‘字段值')
当用户编辑指定字段值时,立即执行一段业务逻辑。可用于执行验证,向用户显示消息或修改表单中的其他字段
@api.depends(field1,...)
用于计算字段函数,用于确保(重新)计算改变被触发
@api.constrains(field1,...)
用于验证函数,用于确保哪些约束生效被触发
以上~
猜你喜欢
- 2024-10-10 什么是键盘记录器? 键盘记录器中文手机版
- 2024-10-10 软件测试入门的敲门砖:一个登录页面有哪些测试点?
- 2024-10-10 忘记windows11系统登录密码?不要急,两步骤教你快速轻松修复!
- 2024-10-10 才发现!微信右上角“+”号功能,按一下能知道你是否被好友删除
- 2024-10-10 Axure RP 9 教程:模拟登录注册 axure rp9怎么注册
- 2024-10-10 谷歌身份验证器(Google Authenticator) 启用新标志
- 2024-10-10 新型病毒即将出现,杀毒软件都阻挡不了密码被盗!
- 2024-10-10 网站密码忘记怎么办?这两个办法助你找回,实测有效
- 2024-10-10 轻松找回Outlook密码,绝对高效 如何找回outlook邮箱
- 2024-10-10 「Excel技巧」怎么才能做到表格部分单元格输入密码才能显示内容
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)