分享免费的编程资源和教程

网站首页 > 技术教程 正文

odoo模型层的记录集与操作 odoo 架构

goqiw 2024-10-10 08:09:34 技术教程 10 ℃ 0 评论

和大多数框架一样,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,...)

用于验证函数,用于确保哪些约束生效被触发

以上~

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表