Tipos de campos en Odoo

Cuando necesitamos incorporar información adicional a Odoo nos podemos encontrar que los campos disponibles en los formularios no son suficientes.

En este artículo vamos a explicar los distintos tipos de campos permitidos en Odoo. Así como sus características y el procedimiento para crear campos nuevos.

En Odoo, se categorizan en 3 grupos principales:

  • Campos básicos: son los enteros, booleanos, punto flotante, cadenas, etc.
  • Campos de relación: usados para representar las relaciones entre objetos.
  • Campos funcionales: son campos que se  calculan al momento, basados en valores de otros campos de la vista.

Campos básicos

 

Boolean

Tipo de campo que solo admite dos posibles valores y cuyos se excluyen el uno del otro.

boolean_field = fields.Boolean()

Char

Tipo de campo formado por una cadena de longitud limitada, que se puede ajustar a través de parámetros.

char_field = fields.Char()

Opciones especificas:

  • Size: Determina el número máximo de caracteres.
  • Translate: El campo puede ser traducido

Text

Tipo de campo usado para almacenar textos largos.

text_field = fields.Text()

HTML

Tipo de campo que almacena HTML, proporciona un visor HTML

html_field = fields.Html()

Integer

Tipo de campo que guarda valores numéricos enteros. Si el valor no está establecido, este devuelve 0.

int_field = fields.Integer()

Float

Tipo de campo que almacena valores decimales. Si el valor no está establecido este devuelve 0,0. Si se establece la opción de dígitos, usará el tipo numérico:

float_field = fields.Float()
float_field = fields.Float(digits=(32, 32))
float_field = fields.Float(digits=lambda cr: (32, 32))

Opciones especificas:

  • Digits: Fuerza el uso de tipo numérico en la base de datos. El parámetro puede ser una tupla (longitud parte en entera, longitud parte decimal) o una llamada que devuelve una tupla y coge el cursor como parámetro.

Date

Tipo de campo que permite almacenar fechas.

date_field = fields.Date()

Opciones especificas:

  • context_today: Devuelve la fecha del día actual, está basado en la zona horaria.
  • today: Devuelve la fecha actual en formato cadena.
  • from_string: Devuelve el valor datetime.date() en tipo cadena.
  • to_string: Retorna el valor de la función datetime.date en formato cadena.

Datetime

Tipo de campo que almacena valores de tipo fecha y hora.

datetime_field = fields.Datetime()

Opciones especificas:

  • context_timestamp: Devuelve la fecha y hora actual, basado en el formato de zona horaria.
  • Now: Devuelve la fecha y hora actual del sistema.
  • from_string: Devuelve el valor datetime.date() en tipo cadena.
  • To_string: Devuelve el valor de la función datetime.date en formato cadena.

Binary

Tipo de campo que almacena valores codificados en base64.

binary_field = fields.Binary()

Selection

Tipo de campo que almacena un texto en la base de datos, que permite al usuario hacer una selección entre varios valores predefinidos. La selección se puede establecer como una lista de tuplas o una llamada que devuelva una lista de tuplas.

selection_field = fields.Selection([('a', 'A')])
selection_field = fields.Selection(selection=[('a', 'A')])
selection_field = fields.Selection(selection='a_function_name')

Opciones especificas:

  • Selection: Lista de tuplas o una función que retorna una lista de tuplas.
  • Size: La opción size=1 es obligatoria cuando se está usando indices que son enteros y no cadenas.

Reference

Tipo de campo que almacena una referencia arbitraria de un modelo y una fila.

refence_field = fields.Reference([('model_name', 'usantString')])
refence_field = fields.Reference(selection=[('model_name', 'String')])
refence_field = fields.Reference(selection='a_function_name')

Opciones especificas:

  • selection: Una lista de tuplas o llamada que coge un grupo de registros como entrada.

Tipos de relación

Many2one

Tipo de campo que almacena una relación de muchos (n) a uno (1).

field_id = fields.Many2one('res.users') 
field_id = fields.Many2one(comodel_name='res.users')

Opciones especificas:

  • comodel_name: Nombre del model opuesto.

One2Many

Tipo de campo que almacena una relación de uno (1) a muchos (m).

field_ids = fields.One2many('res.users', 'rel_id')
field_ids = fields.One2many(comodel_name='res.users', 
                            inverse_name='rel_id')

Opciones especificas:

  • comodel_name: Nombre del modelo opuesto.
  • inverse_name: Relaciona la columna del modelo opuesto.

Many2many

Tipo de campo que almacena una relación de muchos (m) a muchos (n), se crea una nueva tabla con las claves primarias de ambos.

field_ids = fields.Many2many('res.users')
field_ids = fields.Many2many(comodel_name='res.users',
                             relation='table_name',
                             column1='col_name',
                             column2='other_col_name')

Opciones especificas:

  • comodel_name: nombre del modelo opuesto.
  • relation: nombre de la tabla relacionada.
  • column1: nombre de la columna que proviene del identificador de la tabla de la izquierda de la relación.
  • column2: nombre de la columna que proviene del identificador de la tabla de la derecha de la relación.

Campos funcionales

 

Campos calculados

Para la definición solo es necesario el atributo compute y el nombre del método del que obtendrá el resultado.

computed_field = fields.Float(compute='compute_total')

def compute_total(self):
    ...
    self.computed_total = x

Campo relacionado

Simplemente establece el argumento del nombre relacionado con su modelo.

rel_field = fields.Char(string='Name',
                        related='partner_id.name')

El parámetro store nos permite almacenar el valor en la base de datos.

rel_field = fields.Char(string='Name',
                        store=True, 
                        related='partner_id.name')

Property field

Hay algunos casos donde el valor del campo debe cambiar dependiendo de la compañía activa del usuario. Para activar dicho comportamiento, se puede usar la opción company_depent (aka property field).

 

Como podemos ver, Odoo permite almacenar nuestros datos fácilmente, según vaya cambiando la estructura de los mismos.

Deja un comentario