Introduction
Une erreur dite “Related Field” survient quand un champ défini avec l’attribut related= ne parvient pas à résoudre sa référence au moment de l’exécution. Ces incidents sont généralement consignés dans le log serveur et peuvent empêcher l’affichage de vues formulaire, fausser des champs calculés ou interrompre des automatisations.
Les champs liés sont utiles parce qu’ils reproduisent une valeur située sur un autre modèle sans dupliquer les données. Mais si la chaîne de relations est mal écrite ou mal configurée, Odoo lèvera des erreurs de validation ou d’attribut.
Ce guide détaille les raisons courantes de ces erreurs et propose des solutions sûres pour les résoudre.
Qu’est-ce qu’un champ lié dans Odoo ?
Un champ lié permet de pointer vers un champ situé sur un autre modèle.
Exemple pratique :
partner_email = fields.Char(
related="partner_id.email",
store=True
)
Concrètement, cela signifie :
- Le modèle courant possède un champ Many2one nommé partner_id
- Le champ lié reflète la valeur email du modèle res.partner
Si un maillon de cette chaîne est erroné, Odoo lèvera une erreur liée au champ.
Causes fréquentes des erreurs de champs liés dans Odoo
1. Chaîne de relation incorrecte
Si le chemin related pointe vers un champ qui n’existe pas :
related="partner_id.non_existing_field"
Odoo plantera lors du chargement du module ou à l’exécution.
2. Absence du Many2one référencé
Si partner_id n’est pas défini dans le modèle mais est utilisé dans related=, la relation ne peut pas être résolue.
3. Champ lié non stocké utilisé dans des domaines
Quand un champ lié n’est pas stocké mais qu’on l’utilise pour :
- les critères de recherche,
- les filtres,
- les regroupements,
on peut observer des comportements imprévisibles.
Exemple pratique :
store=False
Mais utilisé en recherche → peut déclencher des erreurs.
4. Accès à des relations nulles
Si partner_id est vide, accéder à partner_id.email peut poser problème dans certains contextes.
Même si Odoo gère la plupart des nulls, des chaînes de relations personnalisées peuvent échouer.
5. Incompatibilité de type entre champs
Si le type déclaré du champ lié ne correspond pas à celui de la source :
Exemple pratique :
partner_email = fields.Integer(related="partner_id.email")
Le décalage de type provoque des erreurs de validation.
6. Modification de la structure lors d’une mise à jour
Après une mise à jour de module :
- des noms de champs peuvent avoir changé,
- des chemins de relation peuvent être rompus,
- des dépendances peuvent évoluer,
les champs liés sont sensibles aux changements structurels.
Comment corriger une erreur de champ lié dans Odoo
Étape 1 – Valider le chemin de relation
Vérifiez l’existence de chaque maillon de la chaîne :
related="partner_id.email"
Assurez-vous que :
- partner_id existe,
- et que email est bien présent sur le modèle cible.
Étape 2 – Confirmer la correspondance des types
Si le champ source est de type Char, le champ lié doit aussi être de type Char.
Étape 3 – Activer store=True quand nécessaire
Si le champ lié sert à la recherche ou au reporting :
utilisez store=True,
sinon Odoo peut produire des comportements inattendus lors de requêtes avancées.
Étape 4 – Vérifier les erreurs au chargement des modèles
Si l’erreur survient à l’installation du module :
- redémarrez Odoo,
- mettez à jour le module,
- passez en revue la trace d’erreur (traceback),
les erreurs de champ lié apparaissent souvent dès l’initialisation des modèles.
Étape 5 – Contrôler les dépendances après une mise à jour
Si le problème survient après :
- une montée de version d’Odoo,
- la mise à jour d’un module personnalisé,
vérifiez que les chemins de relation existent toujours.
Comment éviter les erreurs de champs liés
- Privilégiez des chaînes relationnelles courtes et explicites,
- Évitez les cascades profondes de related,
- Assurez toujours l’adéquation des types de champs,
- Activez store=True quand le champ intervient dans des domaines,
- Testez les mises à jour en staging avant production.
Les champs liés offrent beaucoup de facilité, mais deviennent fragiles quand les modèles évoluent.
Comment Dasolo conçoit des architectures relationnelles fiables
Les erreurs de champs liés surviennent souvent lorsque les chaînes relationnelles deviennent trop complexes ou que les modèles hérités évoluent sans mise à jour cohérente.
Même si le log serveur affiche une simple traceback, cela masque fréquemment des incohérences structurelles plus profondes dans les relations de modèles.
Chez Dasolo, nous traitons ces problèmes en examinant la chaîne relationnelle complète plutôt qu’un seul champ isolé. Les causes habituelles comprennent :
- références de champs obsolètes ou incorrectes,
- hiérarchies d’héritage trop profondes,
- chaînes related multi-niveaux,
- gestion inadéquate des mises à jour de modules,
- incohérences liées au contexte multi-sociétés.
Pour garantir la stabilité à long terme, nous favorisons un mapping relationnel explicite, des extensions de modèle contrôlées et une profondeur de dépendance limitée. Une conception relationnelle propre évite les pannes en cascade et facilite la maintenance des modules personnalisés.
Conclusion
L’erreur “Related Field” d’Odoo indique qu’un champ lié n’a pas pu résoudre correctement sa référence, souvent à cause de définitions de modèle incorrectes, de conflits d’héritage ou de dépendances manquantes. Ce n’est pas toujours un simple bug de configuration, mais souvent le symptôme d’un désalignement architectural.
En inspectant méthodiquement les chaînes relationnelles, en validant l’héritage des modèles et en veillant à la cohérence des champs après les mises à jour, les développeurs peuvent supprimer les erreurs récurrentes. Une architecture relationnelle structurée corrige le problème et améliore la lisibilité et la scalabilité du système.
Une discipline rigoureuse sur les relations de modèle garantit qu’Odoo reste prévisible, maintenable et robuste au fur et à mesure que la solution gagne en complexité fonctionnelle.
Questions fréquentes
Non. Elles peuvent apparaître sur Odoo 14, 15, 16 et 17.
Oui. Les champs liés non stockés ralentissent les traitements sur de grands jeux d’enregistrements.
Non — uniquement si le champ doit être utilisé pour la recherche, les filtres ou le reporting.