Se rendre au contenu

Champ One2many dans Odoo : Le Guide Complet

Comment fonctionne le champ One2many dans Odoo, quand l'utiliser et comment l'implémenter dans votre modèle de données.
6 mars 2026 par
Champ One2many dans Odoo : Le Guide Complet
Dasolo
| Aucun commentaire pour l'instant

Introduction


Si vous avez déjà ouvert un bon de commande dans Odoo et remarqué la liste des lignes de commande sous les détails du client, vous avez déjà vu le champ One2many en action. C'est l'un des éléments les plus importants du modèle de données Odoo, et comprendre comment il fonctionne est essentiel pour quiconque impliqué dans le développement ou la personnalisation d'Odoo.


Ce guide explique ce qu'est le champ One2many, comment il fonctionne dans l'ORM Odoo, quand l'utiliser dans votre propre configuration, et comment le créer ou le configurer soit via Odoo Studio, soit directement dans le code Python.

Que vous soyez un utilisateur professionnel essayant de comprendre comment vos données sont structurées, ou un développeur à la recherche d'un tutoriel pratique sur le champ Odoo, cet article couvre ce que vous devez savoir.

Qu'est-ce que le champ One2many dans Odoo


Le champ One2many est un type de champ relationnel dans le cadre Odoo. Il permet à un seul enregistrement parent d'être lié à plusieurs enregistrements enfants d'un autre modèle.


Pensez-y de cette façon : un Client peut avoir de nombreuses Factures. Un Bon de Commande peut contenir de nombreuses Lignes de Commande. Un Projet peut contenir de nombreuses Tâches. L'enregistrement parent détient une référence à tous les enregistrements enfants liés via le champ One2many.


Dans l'interface Odoo, un champ One2many apparaît généralement sous la forme d'une liste intégrée directement à l'intérieur d'une vue de formulaire. Ce tableau en ligne permet aux utilisateurs d'ajouter, de modifier ou de supprimer des enregistrements enfants sans jamais quitter le formulaire parent. C'est l'un des modèles les plus visibles et les plus utilisés dans l'interface utilisateur d'Odoo.


Comment cela diffère-t-il des autres champs relationnels

Odoo a trois principaux types de champs relationnels dans son ORM :


  • Many2one : Un seul enregistrement pointant vers un enregistrement dans un autre modèle (par exemple, un Bon de Commande pointant vers un Client).
  • One2many : Un seul enregistrement lié à plusieurs enregistrements dans un autre modèle (par exemple, un Bon de Commande lié à de nombreuses Lignes de Commande).
  • Many2many : Plusieurs enregistrements des deux côtés liés les uns aux autres (par exemple, un Produit lié à plusieurs Étiquettes, et chaque Étiquette liée à plusieurs Produits).

Le One2many est spécifiquement utilisé lorsqu'un enregistrement enfant appartient à un et un seul parent. Si un enregistrement enfant doit être partagé entre plusieurs parents, Many2many est le bon choix.


Parmi les types de champs Odoo, le One2many est unique car il ne stocke aucune donnée lui-même. C'est un champ virtuel qui lit les données du modèle enfant en utilisant un champ Many2one sur cet enfant comme point d'ancrage.

Comment fonctionne le champ


En coulisses, le champ One2many ne stocke rien dans la table de base de données du modèle parent. Au lieu de cela, il s'appuie sur un champ Many2one qui existe sur le modèle enfant et pointe vers le parent.


C'est un principe fondamental dans l'ORM Odoo : chaque champ One2many a un champ Many2one correspondant sur le modèle lié. Le One2many est essentiellement une recherche inversée. Odoo trouve tous les enregistrements enfants où le champ Many2one est égal à l'ID de l'enregistrement parent actuel.


La relation entre One2many et Many2one

Lorsque vous définissez un champ One2many en Python, vous spécifiez deux paramètres clés :


  • comodel_name : le modèle qui contient les enregistrements enfants.
  • inverse_name : le nom du champ Many2one sur le modèle enfant qui pointe vers le parent.

Voici un exemple simple d'un module Odoo personnalisé, montrant comment un contrat de service est lié à plusieurs enregistrements livrables :


deliverable_ids = fields.One2many(
    comodel_name='service.deliverable',
    inverse_name='contract_id',
    string='Livrables'
)

Dans cet exemple, contract_id est un champ Many2one sur le modèle service.deliverable pointant vers le contrat. Sans que ce Many2one existe d'abord, le One2many ne peut pas fonctionner.


Ce qui se passe dans la base de données

Dans la base de données Odoo, rien n'est stocké dans la table parent pour un champ One2many. Les données résident dans la table du modèle enfant, où chaque ligne enfant a une colonne de clé étrangère pointant vers l'ID de l'enregistrement parent.

Lorsque Odoo charge un enregistrement parent et doit afficher son champ One2many, il exécute une requête SQL équivalente à : trouver toutes les lignes dans la table enfant où la clé étrangère correspond à l'ID du parent actuel. C'est un comportement standard des bases de données relationnelles, et l'ORM Odoo le gère automatiquement.


Ce design est également la raison pour laquelle le champ One2many est considéré comme faisant partie des champs Python d'Odoo qui n'ajoutent pas de colonnes à la base de données. C'est purement une vue calculée des enregistrements liés.

Cas d'utilisation en entreprise


Les champs One2many apparaissent dans tout Odoo car ils modélisent naturellement les relations parent-enfant du monde réel. Voici cinq exemples pratiques tirés de flux de travail commerciaux courants.


1. Commandes de vente et lignes de commande

Le module Ventes utilise un champ One2many appelé order_line_ids sur le modèle sale.order pour lier à sale.order.line. Chaque ligne stocke un produit, une quantité, un prix unitaire et une remise. Les utilisateurs peuvent ajouter ou supprimer des lignes directement depuis le formulaire de commande de vente sans avoir à naviguer ailleurs.


2. Factures et lignes de facture

Dans le module Comptabilité, le modèle account.move utilise un champ One2many pour gérer les lignes de facture (account.move.line). Chaque ligne représente un produit ou un service facturé au client. La facture parent agrège les totaux de toutes ses lignes enfants.


3. Projets et tâches

Le module Projet utilise un champ One2many sur project.project pour afficher toutes les tâches appartenant à ce projet. Dans la vue formulaire, cela peut apparaître sous forme de liste, de tableau kanban ou de diagramme de Gantt, tous pilotés par la même relation One2many sous-jacente.


4. Contacts et sous-contacts

Le modèle res.partner a un champ One2many child_ids qui liste tous les contacts individuels liés à une entreprise. Lorsque vous ouvrez un enregistrement d'entreprise, l'onglet Contacts affiche tous les employés ou personnes de contact. Chacun de ces sous-contacts a un champ Many2one (parent_id) pointant vers l'entreprise.


5. Modèles personnalisés dans le service ou la fabrication

Lors de la création d'un module Odoo personnalisé, le champ One2many est le choix naturel pour tout scénario où un enregistrement possède une liste de sous-enregistrements. Des exemples incluent : une demande de maintenance liée à plusieurs pièces de rechange utilisées, un cours de formation lié à plusieurs dates de session, ou un contrat de service lié à une liste de livrables.


Cette flexibilité est l'une des raisons pour lesquelles le champ One2many est si central à la personnalisation d'Odoo et à la construction de modèles de données adaptés à différentes industries.

Créer ou personnaliser le champ


Il existe deux principales façons d'ajouter un champ One2many dans Odoo : utiliser Odoo Studio pour une approche sans code, ou écrire du code Python directement dans un module personnalisé.


Utiliser Odoo Studio

Odoo Studio ne vous permet pas de créer un champ One2many directement à partir du sélecteur de champs sur le modèle parent. Cela est dû au fait que le One2many nécessite toujours qu'un Many2one existe déjà sur le modèle enfant.

Le processus recommandé dans Studio est le suivant :

  1. Ouvrez le modèle enfant dans Studio et ajoutez un champ Many2one pointant vers le modèle parent.
  2. Une fois le Many2one enregistré, revenez au modèle parent dans Studio.
  3. Ajoutez un nouveau champ et choisissez le type "One2many". Studio vous demandera de sélectionner le modèle associé et le champ Many2one inverse.
  4. Le champ One2many apparaîtra alors comme une liste intégrée dans votre vue de formulaire.

Pour de nombreux utilisateurs professionnels, c'est le chemin le plus simple pour créer des relations One2many sans écrire de code. Les champs Odoo Studio créés de cette manière se comportent exactement comme leurs équivalents Python.


Utiliser du code Python dans un module personnalisé

Pour les développeurs travaillant sur des projets de développement Odoo, définir des champs One2many en Python donne un contrôle total sur le comportement, le nommage et les filtres de domaine. Voici un exemple complet :


from odoo import fields, models

class ServiceContract(models.Model):
    _name = 'service.contract'
    _description = 'Contrat de service'

    name = fields.Char(string='Nom du contrat', required=True)
    deliverable_ids = fields.One2many(
        comodel_name='service.deliverable',
        inverse_name='contract_id',
        string='Livrables'
    )


class ServiceDeliverable(models.Model):
    _name = 'service.deliverable'
    _description = 'Livrable de service'

    contract_id = fields.Many2one(
        comodel_name='service.contract',
        string='Contrat',
        ondelete='cascade'
    )
    name = fields.Char(string='Description', required=True)

Remarquez que le champ Many2one (contract_id) est défini sur le modèle enfant en premier. Le inverse_name dans la définition One2many doit correspondre exactement au nom du champ Many2one.


Création du champ via l'API XML-RPC

Si vous gérez les champs de la base de données Odoo par programmation, vous pouvez également créer des champs One2many via l'API XML-RPC en utilisant le modèle ir.model.fields. Le processus suit la même règle : créez d'abord le Many2one, puis définissez le One2many en utilisant le paramètre relation_field pointant vers le nom du champ Many2one.


Cette approche est particulièrement utile lors de la gestion des champs de base de données Odoo à travers plusieurs environnements ou lors de l'automatisation des workflows de personnalisation Odoo.

Meilleures pratiques


Basé sur l'expérience d'implémentation d'Odoo pour des clients dans différents secteurs, voici les pratiques clés qui font la différence lors du travail avec des champs One2many.


  • Créez toujours le Many2one en premier. Le One2many ne peut pas exister sans son champ inverse. Que vous utilisiez Studio, du code Python ou l'API, le Many2one sur le modèle enfant doit exister avant que vous définissiez le One2many sur le parent.
  • Utilisez le suffixe _ids pour les noms de champs. Par convention dans Odoo, les champs One2many sont nommés avec le suffixe _ids, par exemple line_ids, task_ids, deliverable_ids. Cela rend immédiatement clair dans le code que le champ renvoie un ensemble d'enregistrements.
  • Définissez ondelete='cascade' lorsque c'est approprié. Si les enregistrements enfants doivent être automatiquement supprimés lorsque le parent est supprimé, définissez cette option sur le champ Many2one. Cela empêche l'accumulation d'enregistrements orphelins dans votre base de données.
  • Gardez la liste intégrée ciblée. Ne montrez que les colonnes les plus pertinentes dans la vue liste One2many. Afficher trop de colonnes rend le formulaire lent et difficile à lire. Utilisez l'attribut optional pour les colonnes secondaires que les utilisateurs peuvent activer ou désactiver.
  • Utilisez des filtres de domaine pour restreindre les enregistrements enfants visibles. Vous pouvez ajouter un paramètre domain à une définition de champ One2many pour limiter quels enregistrements enfants sont affichés en fonction de conditions spécifiques. Cela est utile lorsqu'un modèle enfant est partagé entre plusieurs modèles parents.
  • Manipulez les grands ensembles de données avec précaution. Si un enregistrement parent peut avoir des milliers d'enregistrements enfants, évitez de les charger tous en même temps dans la vue du formulaire. Envisagez d'utiliser une vue liste séparée ou d'ajouter une pagination à la table intégrée.

Pièges courants


Voici les erreurs les plus fréquentes qui se produisent lors du travail avec des champs One2many dans Odoo, que ce soit en développement ou en configuration.


Oublier le Many2one inverse

L'erreur la plus courante lors de la création de champs dans Odoo est de définir un One2many sans d'abord créer le Many2one correspondant dans le modèle enfant. Odoo générera une erreur car le champ inverse n'existe pas. Vérifiez toujours que le inverse_name que vous spécifiez existe réellement dans le modèle enfant.


Utilisation de la mauvaise syntaxe d'écriture

Lors de la mise à jour d'un champ One2many via du code Python ou l'API, vous devez utiliser la syntaxe des tuples de commande Odoo. Vous ne pouvez pas attribuer une liste Python simple à un champ One2many. La bonne façon d'utiliser les commandes d'écriture ressemble à ceci :


  • (0, 0, values_dict) pour créer un nouvel enregistrement enfant.
  • (1, child_id, values_dict) pour mettre à jour un enregistrement enfant existant.
  • (2, child_id, 0) pour supprimer un enregistrement enfant existant.
  • (4, child_id, 0) pour ajouter un enregistrement enfant existant à la relation.
  • (5, 0, 0) pour dissocier tous les enregistrements enfants du parent (sans les supprimer).

Essayer d'écrire une liste simple comme record.line_ids = [1, 2, 3] ne fonctionnera pas comme prévu dans l'ORM Odoo.


Confondre One2many avec Many2many

Un One2many signifie que chaque enregistrement enfant appartient à exactement un parent. Si vous vous retrouvez à avoir besoin qu'un enregistrement enfant soit lié à plusieurs parents simultanément, le bon choix est un champ Many2many, pas un One2many. Utiliser One2many dans ce scénario vous obligerait à dupliquer des enregistrements, ce qui crée des problèmes d'intégrité des données.


Problèmes de performance avec de grandes sous-listes

Si un champ One2many affiche des centaines ou des milliers de lignes dans une vue de formulaire, le chargement de la page ralentira considérablement. C'est un problème courant dans la comptabilité (lignes de facture) et l'inventaire (lignes de mouvement de stock). Utilisez l'attribut limit sur la vue liste ou redirigez les utilisateurs vers une vue liste séparée pour les grands ensembles de données.


Enregistrements orphelins après suppression

Si vous supprimez un enregistrement parent sans définir ondelete='cascade' sur le champ Many2one de l'enfant, les enregistrements enfants peuvent rester dans la base de données avec une référence parent nulle ou invalide. Avec le temps, cela peut encombrer votre base de données et provoquer un comportement inattendu dans les vues et les rapports. Définissez toujours une politique de suppression claire lors de la conception de votre modèle de données.

Conclusion


Le champ One2many est un élément fondamental de l'ORM Odoo et du modèle de données Odoo. Il alimente certaines des fonctionnalités les plus essentielles de la plateforme, des lignes de commande de vente aux lignes de facture en passant par les tâches de projet. Une fois que vous comprenez comment cela fonctionne et comment cela se rapporte au champ Many2one sur le modèle enfant, une grande partie de la structure interne d'Odoo devient beaucoup plus facile à lire et à étendre.


Que vous configuriez Odoo pour votre entreprise, que vous le personnalisiez via Studio ou que vous construisiez un module personnalisé à partir de zéro, le champ One2many sera un outil que vous utiliserez régulièrement. Savoir quand l'utiliser, comment le définir correctement et comment éviter les erreurs courantes vous fera gagner beaucoup de temps et évitera des problèmes de données à l'avenir.

Si vous recherchez plus de tutoriels sur les champs Odoo et des guides techniques, explorez les autres articles de la collection Odoo Data & API.

Besoin d'aide avec votre implémentation Odoo ?


Dasolo aide les entreprises à mettre en œuvre, personnaliser et optimiser Odoo pour répondre à leurs besoins commerciaux spécifiques. Que vous ayez besoin d'aide pour concevoir votre modèle de données, construire des modules personnalisés, créer des champs dans Odoo, ou simplement obtenir plus de valeur de votre configuration existante, notre équipe est prête à vous aider.

Si vous avez des questions sur votre projet Odoo ou souhaitez discuter de la meilleure façon de structurer vos données, contactez-nous. Nous sommes heureux de vous aider.

Champ One2many dans Odoo : Le Guide Complet
Dasolo 6 mars 2026
Partager cet article
Se connecter pour laisser un commentaire.