Que son los external IDs? Y como usarlos y actualizarlos?

Gustavo Orrillo
- 10/05/2022 - 2 min. de lectura


Odoo para identificar sus objetos (o registros dentro de la base de datos PostgreSQL), utiliza la columna ID (de la que ya hablamos previamente). Lo cual a nivel base de datos es util, ya que permite identificar en forma única cada registro. Ahora, a nivel lógico presenta sus limitaciones. Supongamos que en un módulo queremos referenciar un registro en particular, por ejemplo la moneda dolar. Como hacemos? Una opción es buscar por nombre; pero esto tiene sus límites. Los usuarios pueden agregar espacios al nombre de la moneda, la pueden modificar y la búsqueda puede llegar a no devolver ningún resultado (o peor, puede devolver más de un registro).

Para solucionar este problema, Odoo brinda el external ID. Que es? Es un identificador de cada objeto que no puede ser actualizado por el usuario y puede ser creado por el programador. Para que se puede utilizar? 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 maneras para conocer los external ID, la primera es en modo desarrollador clickeando el botón "Ver Metadata"


Ahí podremos observar que hay un campo llamado XML ID el cual tiene un valor un poco críptico (fue creado por medio de 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 devuelve el objeto que tiene el external ID que se indicó como parámetro. Si no lo encuentra, devuelve None. 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?

La gran mayoría de los objetos en Odoo no tienen external ID, ya que 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; siendo base el módulo donde esta definido el objeto y ad el id definido por el desarrollador en el archivo xml.

Ahora, supongamos que queremos 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'])
Tambien podemos crear manualmente el registro en el modelo ir.model.data. Lo cual se puede hacer pero creo que es más prolijo utilizar los métodos propios de Odoo, a pesar de tener 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.



 

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.