Odoo10学习笔记二

Field
from odoo import models, fields, api, _

class MyModel(models.Model):
_name = 'mymodule.mymodel'
# Fields are declared as class attributes:
char = fields.Char('Char', 64) # name, size
text = fields.Text('Text')
intg = fields.Integer('Integer')
flot = fields.Float('Float', (16,4)) # name, digits
flag = fields.Boolean('Boolean')
date = fields.Date('Date')
time = fields.Datetime('Date and Time')
html = fields.HTML('Hypertext')
biny = fields.Binary('Binary')

string: 字符串:视图上的字段标签。可以作为第一个参数传递,而不使用关键字(字符串)。
size: char上的大小:该字段存储的最大值(整数,可选)。
translate 文本值是可译的(布尔)。
digits 一对(总的,十进制的),或一个取数据库游标并返回一对(总数,小数)的函数。
help: 用户看到的工具提示(字符串)。
readonly: 设置字段为只读(布尔)。
required: 将字段设置为强制(布尔值)
index: 使字段在数据库中索引(布尔)
default: 默认值;一个静态值或函数集和返回值
states: 字典映射状态值的属性值对列表('readonly ','要求'或'隐形')
groups: 逗号分隔的组XML ID(字符串)列表;限制对这些用户组的字段访问。
company_dependent: 价值取决于公司(布尔)。属性字段
Relational fields(关系字段)

selc = fields.Selection([('code','Desc'),...], 'Label')
refr = fields.Reference([('a.model', 'A Model'),...], 'Label')
m2o = fields.Many2one('amodule.amodel', 'Related Value') # comodel, string
o2m = fields.One2many('amodule.amodel', 'inverse_id', 'Related List')
comodel_name: 目标模型(字符串)的标识符名称。
inverse_name 在One2多上:comodel_name(String)中的逆Many2one字段。
limit 在One2许多:读取时使用的可选限制(整数)。
relation 在Many2许多:存储数据库(字符串)中关系的表的可选名称。
column1 在many2many:该列是“这些”记录中的关系表可选名称
column2 在Many2许多:列的可选名称指的是关系表(字符串)中的“那些”记录。
domain: 可选域过滤客户端上的候选值(域列表或字符串)。
context: 在客户端使用的可选上下文(字典)。
ondelete: 删除引用记录时应做什么:设置空、限制、级联
auto_join: 在跟随关系时使用联接,但跳过相关模型(布尔值)上的安全性。
delegate: 使目标模型的字段可访问;与v7_herits(布尔值)相同。
Computed fields

定义为属性计算提供值。

compute: 计算字段的模型方法的名称
inverse: 逆字段的模型方法的名称(可选)
search: 在字段上实现搜索的模型方法的名称(可选)
store: 字段是否存储在数据库中(布尔值,默认为false)
compute, inverse 、 searche是具有签名的模型方法:

upper = fields.Char(compute='_compute_upper',
inverse='_inverse_upper',
search='_search_upper')

@api.depends('name')
def _compute_upper(self):

for rec in self:
self.upper = self.name.upper() if self.name else False

def _inverse_upper(self):

for rec in self:
self.name = self.upper.lower() if self.upper else False

def _search_upper(self, operator, value):

if operator == 'like':
operator = 'ilike'
return [('name', operator, value)]

计算方法在调用记录集的所有记录分配领域。装饰:方法:openerp.api.depends必须应用计算方法来指定字段的依赖;那些依赖的是用于确定何时重新计算领域;重新计算自动保证缓存/数据库的一致性。注意,同样的方法可以用于多个字段,只需在方法中分配所有给定的字段;该方法将为所有这些字段调用一次。

默认情况下,计算字段不存储在数据库中,并在飞行时计算。添加属性存储=true会将字段的值存储在数据库中。存储字段的优点是,在该字段上搜索是由数据库本身完成的。

缺点是,当必须重新计算字段时,它需要数据库更新。逆方法,顾名思义,是计算方法的倒数:所调用的记录具有字段的值,并且必须对字段依赖项应用必要的更改,以便计算给出预期值。请注意,没有逆方法的计算字段默认为只读。

在对模型进行实际搜索之前,在处理域时调用搜索方法。它必须返回与条件:字段运算符值相等的域。

from openerp import models, fields, api, _

class MyModel(models.Model):
_name = 'module.mymodel'

name = fields.Char(required=True)
parent = fields.Many2one('test_new_api.category')
display_name = fields.Char(compute='_compute_display_name', inverse='_inverse_display_name')

@api.one
@api.depends('name', 'parent.display_name') # this definition is recursive
def _compute_display_name(self):

if self.parent:
  self.display_name = self.parent.display_name + ' / ' + self.name
else:
  self.display_name = self.name

@api.one
def _inverse_display_name(self):

names = self.display_name.split('/')
# determine sequence of categories
categories = []
for name in names[:-1]:
  category = self.search([('name', 'ilike', name.strip())])
  categories.append(category[0])
  categories.append(self)
  # assign parents following sequence
for parent, child in zip(categories, categories[1:]):
  if parent and child:
    child.parent = parent
    # assign name of last category, and reassign display_name (to normalize it)
    self.name = names[-1].strip()
Last modification:January 8th, 2019 at 09:17 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment