您的位置:首页 > 其它

odoo开发学习笔记2

2019-01-20 17:05 169 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_42787135/article/details/86560568

一、代码结构内容
1、整个项目最外面的__init__.py文件主要导入models和controllers。

from . import controllers
from . import models

2、整个项目最外面的__manifest__.py文件主要导入所有的xxx_view.xml文件。标准化格式如下:

# -*- coding: utf-8 -*-
{#模块名
'name': "模块名字",

#模块总结
'summary': """模块概述""",

#模块注释
'description': """模块注释""",

#模块制作人
'author': "姓名",

#模块所属公司
'category': '公司',

#版本号
'version': '0.1',

#依赖的模块,随意添加或者删除可能导致依赖错误
'depends': ['base'],

#导入的视图,可以存放多个视图,但是要注意先后顺序,odoo会按顺序读取
'data': [
# 'security/ir.model.access.csv',#权限
'views/views.xml',#导入的视图
],

#导入的测试数据
'demo': [
'demo/demo.xml',
],

#是否是应用
'application':True
}

3、models文件夹下也要新建一个__init__.py文件主要导入models内部所有的xxx.py文件。

from . import xxx

二、odoo常用的字段类型及定义
1、Char
它是有长度限制的字符串字段。

username = fields.Char(string=u'姓名')

2、Integer
一般用来记整型数据。

userid = fields.Integer(string=u'用户ID')

3、Boolean

flag = fields.Boolean(string=u'标志')

4、Date
日期格式(精确到年月日)

birthdate = fields.Date(string=u'出生日期', default=fields.Date.today())

5、Datetime
日期格式(精确到年月日时分秒)

birthdate = fields.Datetime(string=u'出生日期', default=fields.Datetime.now)

6、Selection
下拉列表

sex = fields.Selection([(1, u'男'),(2, u'女')], string=u'性别', defaults=1)

7、Many2one
表示多对一关系

Many2one('关联的模型名')

8、One2many
表示一对多关系
注:一对多是虚拟的关系(一对多定义时必须保证有对应的多对一关系存在)

One2many('关联的模型名', '与之对应多对一的字段名')

9、Many2many
表示多对多关系

Many2many('关联的模型名')

三、表单的判断【视图的优先级大于后台】
1、required必填
方法一:视图上校验必填

required='1'

方法二:.py文件中校验必填
required=True

2、readonly只读
方法一:视图上设置只读

readonly='1'

方法二:.py文件中设置只读
readonly=True

3、invisible隐藏
视图上字段隐藏

invisible='1'

4、attrs
组合使用invisible,readonly,required。例:

attrs = {'required': [('属性名', '=', True)]}
意思是当这个属性选中时,这个代码所在位置的属性为必填。
attrs = {'readonly': [('属性名', '=', True)]}
意思是当这个属性选中时,这个代码所在位置的属性为只读。
attrs = {'invisible': [('属性名', '=', True)]}
意思是当这个属性选中时,这个代码所在位置的属性为隐藏。

5、domain过滤
domain表达式类似于三元表达式,对数据进行筛选。
方法一:视图上加过滤

domain = "[('id', '=', 1)]"

方法二:.py文件中加过滤
domain = [('id', '=', 1)]

6、表单widget(小部件)

widget="date"(转换成Date类型)

7、字段related
关联字段特殊用法:提供当前一个字段通过关系调用它在其他对象中的值。

related = "关联字段.关联表中的其他字段"

四、菜单和响应动作

视图动作
<act_window id=" " name=" " res_model=" " view_mode=" "/>

菜单
<menuitem id=" " name=" " parent=" " sequence=" " action=" "/>

注:action必须在菜单之前定义,xml文件是顺序加载的。

五、继承
1、模型继承
odoo提供两种继承机制:

  1. 在模块内直接修改在其他模块中定义的model。如:添加字段、重写字段定义、添加约束条件、添加函数方法、重写已定义方法。
  2. 使用代理机制,子模型可以访问父模型的属性,且可以自定义其他属性。

2、视图继承
odoo提供视图继续用于在原有视图上进行扩展,通过inherit_id字段来关联父级视图,在arch元素里通过添加xpath元素来引入父级视图内容。例:

<record id=" " model="ir.ui.view">
<field name="name"> </field>
<field name="model">父类的模型名</field>
<field name="inherit_id" ref="父类视图id"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='description']" position="after">
<field name="子视图中扩展的字段"/>
</xpath>
</field>
</record>
注:
expr属性用于指定从父视图中选择使用的元素
position指定该元素的使用:
position="inside"表示添加到匹配的元素后
position="replace"表示替换匹配到的元素
position="before"表示添加到匹配的元素前,与其同级
position="after"表示同级添加到匹配到的元素后
position="attributes"用于改变匹配元素的attribute属性

六、数据模型自定义字段
1、实时计算字段
odoo模型不仅可以使用数据库的字段,还可以通过函数实时计算定义字段。在model里self是一个集合,可以使用循环来读取,每一个循环得到的单条记录。
2、默认值字段

userid = fields.Many2one('res.users', default=lambda self: self.env.user)
用来获取系统当前的用户
补充:
self.env提供了很多有用的特性:
self.env.cr--->当前数据库查询游标
self.env.uid--->当前用户在数据库中的ID
self.env.user--->当前用户在数据库中的记录
self.env.context--->当前上下文dictionary

七、模型约束
odoo提供两种方法来校验数据:python程序校验和sql约束。
1、python程序用constrains()方法来校验数据,装饰器方法定义需要校验的字段,校验函数在数据不合法时抛出一个错误。例:

from odoo.exceptions import ValidationError
@api.constrains('age')
def _check_age(self):
for record in self:
if record.age < 0:
raise ValidationError('年龄不能为负!')

2、sql约束使用的是模型的_sql_constraints属性,里面是一个校验列表,每一个元素有三个子元素,(name, sql_definition, message),name是自定义的约束名称、sql_definition是一个sql表达式、message是校验失败时返回的错误消息。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: