Odoo的Properties字段 - xiaohao0576/odoo-doc GitHub Wiki

从Odoo16开始,定义了一个Properties字段,可以在不增加数据库列的情况下,随意添加自定义字段,这些字段的值都存储在jsonb的数据类型中。

在Odoo17版本中,列表已经支持显示Properties中定义的属性,也支持以Properties定义的属性为条件进行筛选和分组操作,基本和普通字段差别不大了。

如果要使用Properties字段,还需要PropertiesDefinition字段搭配。

PropertiesDefinition字段定义在父类型, Properties在子类型里面关联,举例说明。

在HelpdeskTeam这个Model中,有下面一个字段

class HelpdeskTeam(models.Model):
    ticket_properties = fields.PropertiesDefinition('Ticket Properties')

在HelpdeskTicket中,有下面两个字段

class HelpdeskTicket(models.Model):
    team_id = fields.Many2one('helpdesk.team', string='Helpdesk Team', default=_default_team_id, index=True, tracking=True)
    properties = fields.Properties('Properties', definition='team_id.ticket_properties',copy=True)

最终的效果是,在Helpdesk的Ticket页面可以随意增加不用类型的属性,并且不会导致数据库中helpdesk数据表的字段增多。并且每个Helpdesk Team的属性字段又相互独立,每个Helpdesk Team都可以拥有不同的自定义字段。

第二个例子是FleetVehicleModelFleetVehicle,代码如下

class FleetVehicleModel(models.Model):
    vehicle_properties_definition = fields.PropertiesDefinition('Vehicle Properties')
class FleetVehicle(models.Model):
    model_id = fields.Many2one('fleet.vehicle.model', 'Model', tracking=True, required=True)
    vehicle_properties = fields.Properties('Properties', definition='model_id.vehicle_properties_definition', copy=True)

以上代码就可以实现在FleetVehicle中为不同品牌的车辆定义不同的属性

如果一个Model有Properties类型的字段,在这个Model的Form页面下,点击齿轮图标,在存档、复制、删除下面,会有一个属性的按钮,点击这个按钮可以增加属性

更多例子,可以在源代码中搜索fields.Properties关键字