Que son los external IDs de Odoo? Como se usan y actualizan?

19 de julio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Odoo identifica sus objetos (o registros dentro de la base de datos PostgreSQL) con la columna ID (de la que ya hablamos previamente). Esto a nivel base de datos es util, ya que permite identificar en forma única cada registro. Esta técnica a nivel lógico presenta sus limitaciones. Por ejemplo si en un módulo necesitamos referenciar un registro en particular, por ejemplo la moneda dolar. Como se hace? Una opción es buscar por nombre; pero esa idea tiene sus falencias. Los usuarios pueden modificar el nombre de la moneda, cambiarla de USD a Dolar Americano por ejemplo (lo que llevaría a necesitar cambiar todos los lugares donde se realiza dicha búsqueda).

Para solucionar este problema, Odoo provee el external ID. Que es el external ID? Es un identificador de cada objeto que no puede ser actualizado por el usuario y puede ser creado por el programador (lamentablemente no ocurre con todos los registros, aunque debería ya que haría más facil la vida si usamos el método load). 

Para que se puede utilizar el external ID? Son fundamentales cuando llega el momento de migrar datos. Por ejemplo la aplicación odoo_csv_import permite la actualización de registros gracias a los external IDs.


Como se consultan los external ID?

Hay dos formas de conocer los external ID en Odoo. La primera es en modo desarrollador clickeando el botón "Ver Metadata"


En esta ventana de diálogo podemos ver que hay un campo llamado XML ID el cual tiene un valor un poco críptico (porque fue creado con la función export_data). Si queremos hacerlo en un módulo, tenemos que buscar la referencia. Supongamos que deseamos buscar la moneda USD (que tiene el external ID base.USD),


usd_currency = self.env.ref('base.usd')


La función  self.env.ref (muy importante ya que si hacen un grep, verán que se usa en muchísimos lados del core) devuelve el objeto que tiene el external ID que se indicó como parámetro. Si no lo encuentra, devuelve None (o sea, alguien borró dicho objeto). 

Ahora, supongamos que queremos conocer el external ID de cualquier objeto, para ello debemos consultar su metadata por medio de la función get_metadata:


external_id = your_record.get_metadata()[0].get('xmlid') 

Como se crean los external IDs?


Lamentablemente la gran mayoría de los objetos en Odoo no tienen external ID (estos son creados cuando se crean los objetos al momento de instalarse un módulo). Si observan un archivo de datos de cualquier módulo de Odoo verán que tiene la siguiente estructura:


<record id="ad" model="res.country">
<field name="name">Andorra</field>
<field name="code">ad</field>
<field name="currency_id" ref="EUR" />
<field eval="376" name="phone_code" />
</record>


En este registro tenemos el id con el valor ad. Si chequeamos ahora para Andorra, cual es su external ID:



Como pueden ver el external ID es base.ad. El external ID tiene dos partes. La primera es el módulo que lo crea y el segundo el valor definido en el archivo de datos del módulo.

Si necesitamos asignar un external_id a un registro ya existente, para ello debemos utilizar el método export_data (el cual invoca la función export_rows la cual genera el xml_id).

record.record.export_data(['id'])


Se puede crear manualmente el registro en el modelo ir.model.data. Ahora es más prolijo utilizar los métodos propios de Odoo, pese a el inconveniente de asignar como application name el valor __export__. Pero es la única contra, ya que el ID que se genera es único.

Por último, si queremos consultar todas los external IDs generados en el sistema, en modo desarrollador hay que acceder al menú Ajustes > Técnico > Secuencias e identificadores > Identificadores.


Gustavo Orrillo 19 de julio de 2023
Compartir
Categorías
Archivar
Identificarse dejar un comentario