Odoo - Tutorial de Campos

Todos los campos de Odoo, para qué se utilizan y cómo

Campos Básicos

Boolean

field_boolean = fields.Boolean('Campo Boolean')

Se representa como un checkbox y almacena una variable tipo boolean.

Integer

field_integer = fields.Integer('Campo Integer')

Se representa como un input de número y almacena una variable tipo número entero.

Float

field_float = fields.Float('Campo Float')

Se representa como un input de número y almacena una variable tipo número flotante (decimal).

Char

field_char = fields.Char('Campo Char')

Se representa como un input de texto y almacena una variable de string corto.

Text

field_text = fields.Text('Campo Text')

Se representa como un textarea y almacena una variable de string largo.

Selection

field_selection = fields.Selection([('data01', 'Data 01'), ('data02', 'Data 02')], string='Campo Selection')

Se representa como un selection de HTML con una opción por cada dato que le pasamos. Almacena un array que a su vez tiene componentes de dos componentes; el primer índice hace referencia al nombre técnico (key) del componente y el segundo al nombre a mostrar (label).

HTML

field_html = fields.Html('Campo HTML')

Se representa como un textarea enriquecido y editable, y almacena una variable de string largo (está pensado para guardar código HTML).

Binary

field_binary = fields.Binary('Campo Binary')

Se representa como un input tipo file (permite subir un archivo) y almacena una variable binaria, es decir, permite almacenar archivos con cualquier extensión (cómo imágenes o PDF).

Date

field_date = fields.Date('Campo Date')

Se representa como un input de fecha (widget propio de odoo) y almacena una variable de fecha (string formateado).

Datetime

field_datetime = fields.Datetime('Campo Datetime')

Similar a Date pero además de guardar la fecha permite guardar la hora.

Campos Relacionales

Many2one

fields_many2one = fields.Many2one('res.partner', 'Campo Many2one')

Se representa como un desplegable que trae los registros del módulo al cual se relaciona. Técnicamente solo almacena el número de ID del registro, tiene la capacidad de traer todos pero solo almacena uno.

One2many

fields_one2many = fields.One2many('res.partner', 'res_id', 'Campo One2many')

Se representa como una tabla que muestra múltiples registros y sus campos como columnas de dicha tabla (la mencionada lista puede personalizarse). El primer argumento es el nombre del modelo y el segundo (en este caso res_id) es un campo Many2one que debe existir en el modelo del primer argumento. Almacena un array de ID.

Many2many

fields_many2many = fields.Many2many('res.partner', 'res_id', 'Campo Many2many')

Similar al One2many, tanto en declaración como en visual (suele mostrarse como uan tabla), se diferencia principalmente en su comportamiento, siendo una especie de mezcla entre el Many2one y el One2many. De esta manera, en lugar de relacionar muchos registros del modelo A en un registro del modelo B permite relacionar muchos registros del modelo A con muchos registros del modelo B.

Campo Pseudo-Relacionales

Reference

fields_reference = fields.Reference('Campo Reference')

Almacena un string que es una referencia a un modelo y un registro con este patrón: "model_name,res_id". La diferencia con otros campos es que en este caso no genera una Foreign Key en SQL.

Many2oneReference

fields_many2onereference = fields.Many2oneReference('res.partner', 'Campo Many2oneReference')

Similar al Many2one clásico, almacena un número entero siendo el ID del registro al cual se vincula y requiere el nombre del modelo como primer parámetro. A diferencia del Many2one, al ser un Pseudo-Relacional, no guarda una Foreign Key en SQL.

Campos Relacionales y Computados

A diferencia de los tipos de campos y sus definiciones, en el caso de los Relacionales y Computados nos encontramos con un concepto que se aplica a dichos campos. Todos los campos de Odoo declarados anteriormente pueden ser relacionales y computados.

Campo Relacional

Convierte al campo en cuestión en un campo de sólo lectura, haciendo que su contenido esté vinculado (relacionado) al contenido de otro campo. Por ejemplo, si queremos acceder al valor del campo street de un registro res.partner que llamamos desde el account.move, sabiendo que el campo que los relaciona es el partner_id, haremos lo siguiente:

field_relation_street = fields.Char('Campo Street', related='partner_id.street')

Las consideraciones a tener con los relacionales es que deben ser del mismo tipo entre el campo a relacionar y el relacionado, y que la relación en si debe existir en el modelo. Al no almacenar ningún dato (solo una relación) no ocupa espacio en la base de datos, salvo que le digamos que el campo debe ser almacenable.

Campo Computado

El concepto de computación en Odoo consiste en asociar a un campo un valor dependiendo de un cálculo. El cálculo se ejecuta cuando el/los campo/s de los cuales depende el computado se inician o modifican, pero a diferencia de un onchange su valor contiene una lógica interna y no almacena el dato (a menos que lo hagamos almacenable). Por ejemplo, para repetir el ejemplo del campo relacional pero haciendolo computado, haremos lo siguiente:

field_compute_street = fields.Char('Campo Street', compute='compute_street')
@api.depends('partner_id')
def compute_street(self):
    for rec in self:
        rec.field_compute_street = rec.partner_id.street

Por supuesto que este ejemplo solo debe ser tomado en cuenta a modo de ejemplo, los campos computados deben utilizarse para cálculos y no para relaciones (para eso existen los relacionales). Hago notar el uso del api.depends, que si bien no es obligatorio en este caso, proporciona más control a futuro en caso de que queramos agregar más campos a la fórmula o hacerlo almacenable.

Entradas Relacionadas

# odoo
Odoo - Tutorial de Campos
Ignacio Buioli 12 de junio de 2022
4 min. de lectura
Compartir
Categorías
Archivar