Odoo中的“稀疏字段”类型支持被移到了单独的模块里了
-
Odoo中有一个很特殊的字段类型:“稀疏字段” 和与之对应的"序列化字段“,估计没有人用到过,不过它真的一直是存在的。用法如下:
class MySparseModel(models.Model): _name = 'Mymodel.sparse_test' data = fields.Serialized() boolean = fields.Boolean(sparse='data') integer = fields.Integer(sparse='data') float = fields.Float(sparse='data') char = fields.Char(sparse='data') selection = fields.Selection([('one', 'One'), ('two', 'Two')], sparse='data') partner = fields.Many2one('res.partner', sparse='data')
这里我们首先定义了一个“序列化字段”,其实它就是一个普通的text字段,而后面所定义的各种类型的字段与普通字段的区别在于有一个
sparse
参数指向之前的序列化字段。
后面这一系列字段就是所谓的“稀疏字段”。它并不会在数据库中创建对应的字段,而是其值会通过json序列化后存储到对应的“序列化字段”。通过名字,我们也能了解到这种字段的应用场景,就是“稀疏字段”的值大多数情况下都是空值,只有很少数的情况下会有值,单独在数据库中保留一个字段并不合理,所以可以讲非空的值序列化后存储到“序列化字段”内。好象还不错的想法,不过好像Odoo公司的人也没怎么用过这个类型的字段,所以它终于被移出了核心,放到了addons里,真有好这口的可以找
sparse_fields
这个模块,然后安装后使用。这是讲这个字段类型移出核心的提交:
https://github.com/odoo/odoo/pull/15070 -
@digitalsatori 你好,这个具体怎么使用呢,
data字段包含所有字段数据吗,
data字段改变值,会更改其他字段的值吗 -
data字段包含了json的数据,其中的值对应的是其它字段的值。所以在上例中,我们可以跟平常一样操作model对象,比如:
# 读取数据 sparse_records=self.env['Mymodel.sparse_test'].search([]) values = [(record.boolean, record.integer, record.float, ...) for record in sparse_records] # 赋值 sparse_records[0].boolean = True sparse_records[0].char = 'Good'
操作跟其它的模型没有一点区别。只是说在数据库中只有data一个字段。我们一般是不会去操作data字段的因为里面保存的是model的其它field的json数据。