Odoo ORM 的一些其它常用用法
Odoo 的 ORM 除了基本的查询、创建、更新和删除操作外,还提供了许多高级功能,使开发者可以更加灵活地与数据库进行交互。以下是 Odoo ORM 的一些其它常用用法:
1. 字段默认值 (default)
Odoo 模型中的字段可以通过 default
参数设定默认值:
class MyModel(models.Model):
_name = 'my.model'
name = fields.Char(string="Name", default="Unnamed")
is_active = fields.Boolean(string="Active", default=True)
你也可以定义一个方法来动态设置默认值:
class MyModel(models.Model):
_name = 'my.model'
def _default_name(self):
return "Auto Name"
name = fields.Char(string="Name", default=_default_name)
2. 关联字段 (Many2one, One2many, Many2many)
Odoo 的 ORM 支持多种类型的关系字段,用于表示模型之间的关系。
- Many2one (多对一): 用于连接两个模型,通常代表一个父对象。
class MyModel(models.Model):
_name = 'my.model'
partner_id = fields.Many2one('res.partner', string="Partner")
- One2many (一对多): 表示当前模型和其他模型的一对多关系。
class MyModel(models.Model):
_name = 'my.model'
order_ids = fields.One2many('sale.order', 'model_id', string="Orders")
- Many2many (多对多): 表示两个模型之间的多对多关系。
class MyModel(models.Model):
_name = 'my.model'
tag_ids = fields.Many2many('product.tag', string="Tags")
3. 上下文 (Context)
上下文用于传递额外信息到 ORM 操作中,通常用于定制数据行为。
# Example: 使用上下文在特定情况下传递额外信息
partners = self.env['res.partner'].with_context(active_test=False).search([])
active_test=False
将返回所有记录(包括已被标记为非活跃的记录)。- 上下文还可以用于国际化、控制权限等。
4. 计算字段 (Computed Fields)
计算字段的值不存储在数据库中,而是动态计算。可以通过设置 compute
参数来实现。
class MyModel(models.Model):
_name = 'my.model'
name = fields.Char(string="Name")
description = fields.Char(string="Description", compute="_compute_description")
@api.depends('name')
def _compute_description(self):
for record in self:
record.description = f"Description for {record.name}"
计算字段也可以是可存储的,通过将 store=True
添加到字段定义中:
description = fields.Char(string="Description", compute="_compute_description", store=True)
5. 约束 (Constraints)
Odoo 提供了 constraints
来确保数据的有效性。你可以通过 @api.constrains
来设置模型约束。
class MyModel(models.Model):
_name = 'my.model'
name = fields.Char(string="Name")
age = fields.Integer(string="Age")
@api.constrains('age')
def _check_age(self):
for record in self:
if record.age < 0:
raise ValidationError("Age cannot be negative")
6. 继承 (Inheritance)
Odoo 支持模型的继承,有两种方式:
- 经典继承: 创建一个新的模型并添加或重写已有模型的字段和方法。
class NewModel(models.Model):
_inherit = 'existing.model'
new_field = fields.Char(string="New Field")
- 装饰继承 (Delegation Inheritance): 通过
_inherits
继承另一个模型,并将其字段和方法委派到当前模型。
class MyModel(models.Model):
_name = 'my.model'
_inherits = {'existing.model': 'existing_model_id'}
existing_model_id = fields.Many2one('existing.model', required=True, ondelete="cascade")
7. 访问控制 (Access Control)
Odoo 模型可以通过 access_rights
和 record_rules
进行权限控制:
- 访问权限 (access_rights) 定义用户组对模型的读、写、创建和删除权限。
- 记录规则 (record_rules) 允许你基于条件限制用户对某些记录的访问。
# XML 中定义访问权限
<record id="model_my_model_access" model="ir.model.access">
<field name="name">my.model.access</field>
<field name="model_id" ref="model_my_model"/>
<field name="group_id" ref="base.group_user"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_unlink" eval="False"/>
</record>
8. 动作 (Actions)
Odoo 支持多种动作来帮助定制用户界面行为,例如服务器动作、窗口操作和自动化操作。
- 服务器动作: 可以在模型上执行特定操作。
@api.model
def my_server_action(self):
# 执行一些操作
return True
- 窗口动作: 打开一个视图或页面。
<record id="action_my_model" model="ir.actions.act_window">
<field name="name">My Model</field>
<field name="res_model">my.model</field>
<field name="view_mode">tree,form</field>
</record>
9. 创建和复制记录 (Copy)
Odoo 提供 copy
方法用于复制记录,可以通过重写该方法来自定义复制行为。
class MyModel(models.Model):
_name = 'my.model'
def copy(self, default=None):
default = dict(default or {})
default['name'] = self.name + ' (copy)'
return super(MyModel, self).copy(default)
10. 批量操作 (Create, Write, Unlink)
Odoo 的 ORM 支持批量操作。例如,write
可以同时修改多个记录。
# 批量更新记录
records = self.env['my.model'].search([('is_active', '=', True)])
records.write({'is_active': False})
11. 分页 (Pagination)
当查询数据量较大时,可以使用分页查询来提升性能。
# 分页查询,偏移量为 0,限制为 20 条
records = self.env['my.model'].search([], offset=0, limit=20)
总结
Odoo 的 ORM 系统通过其丰富的 API 提供了从简单的数据库交互到复杂的业务逻辑实现的全面支持,极大地简化了 Odoo 应用的开发过程。
原文地址:https://blog.csdn.net/qq_17802895/article/details/142640674
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!