orm 各种字段及其属性
odoo model
odoo 提供了一个简单的机制来帮助建立一个新的空模块
$ odoo-bin scaffold <module name> <where to put it>
$ ./odoo-bin scaffold your_addons_name my-addons/
ORM
对象关系映射,基本可以理解为一个python对 数据库的驱动。这里的_name是从必须的。在数据库中就是表的名称。
from odoo import models
class MinimalModel(models.Model):
_name = 'test.model'
_description = 'Demo Odoo Tutorial' # 只是一个描述,如果不写可能会出现警告。
_inherit = ['mail.thread', 'mail.activity.mixin'] # 继承的那些模块,才有mail这个模块。
模型字段
字段用于定义模型可以存储的内容和存储位置。字段被定义为模型类上的属性
from odoo import models, fields
class LessMinimalModel(models.Model):
_name = 'test.model2'
# name = fields.Char()
# 添加其他的属性,这里required为必填。
name = field.Char(required=True)
所有字段都有一些属性可用,以下是最常见的属性:
string(unicode,默认:字段的名称)UI中字段的标签(用户可以看到)。
required(bool,默认:False)如果
True,该字段不能为空,它必须具有默认值,或者在创建记录时始终被赋予一个值。help(unicode,默认:'')长窗体,向UI中的用户提供帮助工具提示.
index(bool,默认:False)请求Odoo创建一个数据库索引列上。
简单字段
保留字段
Odoo在所有模型中创建了几个字段。这些字段由系统管理,不应该写入。如果有用或必要可以查看。
id(Id)模型中记录的唯一标识符。
create_date(Datetime)记录的创建日期。
create_uid(Many2one)创建记录的用户。
write_date(Datetime)记录的最后修改日期。
write_uid(Many2one)上次修改记录的用户。
模型之间的关系
关系字段
关系字段链接记录,要么是同一个模型(层次结构),要么是不同模型之间的链接。
Many2one(other_model, ondelete='set null')
指向其他对象的简单链接
print foo.other_id.name
One2many(other_model, related_field)
虚拟关系,与Many2one。一个One2many作为一个记录容器,访问它会产生(可能是空的)一组记录:
for other in foo.other_ids:
print other.name
注意:因为One2many是一种虚拟的关系必有一个Many2one字段中的other_model,以及它的名字必须是related_field
双向多重关系,一边的任何记录都可以与另一边的任意数量的记录相关联。作为一个记录容器,访问它还会导致一组可能为空的记录:
for other in foo.other_ids:
print other.name
模型约束
Odoo提供了两种方法来设置自动验证的不变量:Python constraints和SQL constraints.
python 约束
Python约束定义为用constrains(),并在记录集中调用。修饰器指定约束中涉及哪些字段,以便在修改其中一个字段时自动计算约束。如果不满足该方法的不变量,则该方法将引发异常:
from odoo.exceptions import ValidationError
@api.constrains('age') # 给出警告也是可以写入数据库的。
def _check_something(self):
for record in self:
if record.age > 20:
raise ValidationError("Your record is too old: %s" % record.age)
# all records passed the test, don't return anything
SQL 约束
SQL约束是通过模型属性定义的。_sql_constraints。后者被分配给一个字符串三元组的列表。(name, sql_definition, message),在哪里name是有效的SQL约束名称,sql_definition是表约束表达,和message是错误消息。
# 指定 name 为唯一值
_sql_constraints = [
('name_uniq', 'unique(name)', 'Description must be unique'),
]
其他约束参考PostgreSQL文档,