OdooWiki OCA HUB

Base - Write Diff

base_write_diff folder_open OCA/server-tools open_in_new
Hidden Licencia: AGPL-3

Este módulo permite filtrar los valores que se actualizarán en los registros según si son realmente diferentes de los valores actuales de los registros.

Traducción automática al español (DeepSeek) de la descripción original de OCA, que está en inglés.

auto_awesome Qué hace este módulo

Generado por IA a partir del código · Odoo 19.0

Evita que Odoo guarde valores de campo idénticos a los que ya están almacenados, de modo que los registros solo se actualicen cuando algo cambie realmente. Añade un nuevo método write_diff que los desarrolladores pueden usar para omitir actualizaciones inútiles.

Este módulo cambia cómo Odoo guarda los cambios en los registros. Normalmente, cuando se escribe un valor en un registro, Odoo lo almacena incluso si el nuevo valor es exactamente igual al actual. Con este módulo, un nuevo método llamado write_diff está disponible en todos los registros: compara los valores que se quieren guardar con los valores que ya están en el registro y solo conserva los campos que son realmente diferentes.

  • Si no hay nada diferente, no se realiza ninguna actualización.
  • Para las listas relacionadas (campos one2many y many2many), también comprueba las líneas internas y elimina los subvalores sin cambios.
  • El comportamiento normal de write solo se ve afectado cuando se establece el indicador de contexto especial write_use_diff_values, por lo que el código existente sigue funcionando como antes.

No hay ningún menú o pantalla nueva: este es un módulo técnico oculto utilizado por otros módulos y desarrolladores. Afecta al modelo base (base) del que hereda cada registro de Odoo, y se apoya en la función de instantánea de registro del módulo web. Los usuarios de negocio notarán menos entradas de cambios innecesarias en el chatter y menos automatizaciones activadas cuando un guardado no modifica realmente nada.

Depende de

baseweb
Modelos y campos (1)
  • base · amplía un modelo existente

Texto generado por IA (DeepSeek) al leer el código de la versión 19.0 en GitHub; puede contener errores, así que verifícalo en el código antes de decidir. Ver el código en GitHub

Disponibilidad por versión

Revisado: 2026-11-03
Confirmado (verificado en repositorio y rama) Estimado (sin verificar) Sin información

Estado de confirmación: 2 confirmadas, 7 sin información de 9 versiones.

Fuentes · Odoo 19.0

Confirmado el 2026-11-03 en la rama 19.0 de OCA/server-tools.

terminal Instalación y uso

Documentación de OCA · Odoo 19.0

Resumen

Este módulo te permite actualizar registros filtrando los campos cuyos valores van a quedar sin cambios por BaseModel.write(); por ejemplo, supongamos que tienes:

>>> self
sale.order.line(1,)
>>> self.price_unit
10.00

Si usas self.write({"price_unit": 10.00}) o self.price_unit = 10.00, Odoo puede acabar ejecutando operaciones innecesarias, como desencadenar la actualización del campo, recalcular campos computados que dependen de price_unit, etc., incluso si el valor en realidad no ha cambiado.

Al usar este módulo, puedes evitar todo eso.

Puedes usar este módulo de 3 formas distintas. Todas ellas requieren que añadas este módulo como dependencia de tu módulo.

1 - Clave de contexto "write_use_diff_values"

Al añadir write_use_diff_values=True al contexto al actualizar el valor de un campo, el parche BaseModel.write() se encargará de filtrar los valores de los campos que sean iguales a los actuales del registro.

⚠️ Atención: la clave de contexto se propaga hacia abajo a otras llamadas write()

Ejemplo:

from odoo import models


class ProductTemplate(models.Model):
    _inherit = "product.template"

    def write(self, vals):
        # Update only fields that are actually different
        self = self.with_context(write_use_diff_values=True)
        return super().write(vals)


class ProductProduct(models.Model):
    _inherit = "product.product"

    def update_code_if_necessary(self, code: str):
        # Update ``default_code`` only if different from the current value
        self.with_context(write_use_diff_values=True).default_code = code

2 - Método BaseModel.write_diff()

Es lo mismo que llamar a write(), pero habilita automáticamente el flag de contexto "write_use_diff_values": self.write_diff(vals) es un atajo para self.with_context(write_use_diff_values=True).write(vals)

⚠️ Atención: la clave de contexto se propaga hacia abajo a otras llamadas write()

3 - Método BaseModel._get_write_diff_values(vals)

Este método acepta como parámetro un dict similar a write, y devuelve un nuevo dict formado por los campos que realmente actualizarán los valores del registro. Esto permite un comportamiento más flexible y personalizable que el uso de la clave de contexto, porque:

  • podrás filtrar campos específicos, en lugar de filtrar todos los campos cuyos valores no cambiarán tras la actualización;
  • podrás ejecutar el filtrado en modelos específicos, en lugar de ejecutarlo en todos los modelos implicados en la pila de llamadas write() desde el primer uso de la clave de contexto hasta el método base BaseModel.write().

Ejemplo:

from collections import defaultdict

from odoo import api, models
from odoo.tools.misc import frozendict


class ProductProduct(models.Model):
    _inherit = "product.product"

    def write(self, vals):
        # OVERRIDE: ``odoo.addons.product.models.product_product.Product.write()``
        # override will clear the whole registry cache if either 'active' or
        # 'product_template_attribute_value_ids' are found in the ``vals`` dictionary:
        # remove them unless it's necessary to update them
        fnames = {"active", "product_template_attribute_value_ids"}
        if vals_to_check := {f: vals.pop(f) for f in fnames.intersection(vals)}:
            groups = defaultdict(lambda: self.browse())
            for prod in self:
                groups[frozendict(prod._get_write_diff_values(vals_to_check))] += prod
            for diff_vals, prods in groups.items():
                if res_vals := (vals | dict(diff_vals)):
                    super(ProductProduct, prods).write(res_vals)
            return True
        return super().write(vals)

Traducción automática al español (DeepSeek) de la documentación original de OCA; los comandos y el código no se traducen. Sin información verificada en OCA: Instalación, Configuración.

info

Datos importados de GitHub: esta ficha refleja la última revisión del catálogo, no una consulta en directo. Verifica siempre en la documentación del módulo y en staging antes de instalar en producción.