自学内容网 自学内容网

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_rightsrecord_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)!