product.product : champs, relations et API
Le modèle product.product (« Variante de produit ») est un modèle persistant déclaré par le module Products & Pricelists, puis enrichi par 34 autres modules. Il expose 139 champs, dont 110 déclarés directement sur le modèle ; 107 champs d'autres modèles pointent vers lui. Retrouvez ci-dessous chaque champ avec son nom technique, son type, son libellé français et ses relations, puis un exemple d'appel à l'API JSON-2 d'Odoo 20.
Fiche d'identité
- Nom technique
product.product- Libellé
- Variante de produit
- Type
- Persistant (models.Model)
- Table SQL
product_product- Module d'origine
- Products & Pricelists (
product) - Étendu par
- account, sale, sale_project, event_product, event_booth_sale, hr_expense, point_of_sale, loyalty, stock, mrp, stock_account, mrp_account, stock_delivery, purchase, purchase_stock, product_expiry, repair, mrp_subcontracting, mrp_subcontracting_account, stock_dropshipping, mrp_subcontracting_purchase, pos_hr, pos_loyalty, pos_self_order, product_margin, purchase_requisition, sale_edi_ubl, sale_gelato, sale_timesheet, website_sale, website_sale_slides, website_event_sale, website_sale_stock, website_sale_loyalty
- Tri par défaut (_order)
default_code, name, id- Hérite de (mixins)
- mail.threadmail.activity.mixinpos.load.mixinwebsite.structured_data.mixinwebsite.trackable.mixin
- Délégation (_inherits)
- product.template : les champs de ce modèle sont aussi accessibles, via
product_tmpl_id
Champs du modèle
110 champs propres, 24 hérités des mixins et 5 champs automatiques de l'ORM. Cliquez sur un nom pour obtenir le lien direct vers le champ.
139 champs affichés sur 139
| Nom technique | Libellé | Type | Détails |
|---|---|---|---|
| active | Actif Décocher cette case vous permet de masquer le produit sans le supprimer. | boolean | |
| additional_product_tag_ids | Étiquettes variantes | many2many | |
| all_product_tag_ids | Toutes les étiquettes de produit | many2many | calculé |
| avg_cost | Coût moyen | monetary | calculé ajouté par WMS Accounting ( |
| barcode | Code-barres Numéro d'article international (IAN) utilisé pour identifier cet article. | char | |
| base_unit_count | Unité de référence Afficher le prix unitaire de base. Définissez la valeur sur 0 pour le masquer pour ce produit. | float | requis |
| base_unit_id | Unité de mesure personnalisée Définissez une unité personnalisée à afficher dans le champ Prix par unité de mesure. | many2one | |
| base_unit_name | Nom de l'unité de base Affiche l'unité personnalisée pour les produits si elle est définie ou l'unité de mesure sélectionnée dans le cas contraire. | char | calculé |
| base_unit_price | Prix unitaire | monetary | calculé |
| bom_count | # Nomenclatures | integer | calculé ajouté par Fabrication ( |
| bom_line_ids | Composants de nomenclature | one2many | inverse : ajouté par Fabrication ( |
| can_image_1024_be_zoomed | L'Image 1024 peut être agrandie | boolean | calculé |
| can_image_variant_1024_be_zoomed | Peut-on agrandir l'image 1024 | boolean | calculé, stocké |
| catalog_is_in_order | Catalog Is In Order | boolean | |
| catalog_is_in_selected_section | Catalog Is In Selected Section | boolean | ajouté par Facturation ( |
| channel_ids | Cours | one2many | inverse : ajouté par Sell Courses ( |
| code | Référence | char | calculé |
| combination_indices | Indices combinés | char | calculé, stocké |
| company_currency_id | Devise de la valorisation Champ technique pour afficher correctement la devise sélectionnée actuellement par l'entreprise qui correspond à la valeur totale des couches de valorisation du produit | many2one | calculé ajouté par WMS Accounting ( |
| country_of_origin | Origine des marchandises Rules of origin determine where goods originate, i.e. not where they have been shipped from, but where they have been produced or manufactured. As such, the ‘origin’ is the 'economic nationality' of goods traded in commerce. | many2one | ajouté par Delivery - Stock ( |
| date_from | Marge depuis | date | calculé ajouté par Margins by Products ( |
| date_to | Marge jusqu'à | date | calculé ajouté par Margins by Products ( |
| default_code | Référence interne | char | |
| event_ticket_ids | Tickets d'événement | one2many | inverse : ajouté par Events Product ( |
| expected_margin | Marge attendue Vente attendue - Coût normal | float | calculé ajouté par Margins by Products ( |
| expected_margin_rate | Marge attendue (%) Marge attendue * 100 / Vente attendue | float | calculé ajouté par Margins by Products ( |
| expense_job_position_limit_ids | Job Position Limits | one2many | inverse : ajouté par Dépenses ( |
| extra_uom_ids | Emballages supplémentaires Emballages supplémentaires spécifiques à la variante pour ce produit pouvant être utilisés pour les ventes | many2many→ uom.uom | |
| free_qty | Quantité virtuellement disponible Available quantity (computed as Quantity On Hand - reserved quantity - quantity to remove) In a context with a single Stock Location, this includes goods stored in this location, or any of its children. In a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children. Otherwise, this includes goods stored in any Stock Location with 'internal' type. | float | calculé |
| gelato_product_uid | Uid du produit Gelato | char | lecture seule ajouté par Gelato ( |
| gelato_variant_image_ids | Images d’impression des variantes Gelato Afin de garantir un bon résultat d’impression, uploadez un PNG de l’ensemble de la zone d’impression avec vos éléments graphiques correctement positionnés. | one2many | lecture seule inverse : ajouté par Gelato ( |
| hs_code | Code SH Code normalisé pour l'expédition internationale et la déclaration de marchandises. | char | ajouté par Delivery - Stock ( |
| image_1024 | Image 1024 | image | calculé |
| image_128 | Image 128 | image | calculé |
| image_1920 | Image | image | calculé |
| image_256 | Image 256 | image | calculé |
| image_512 | Image 512 | image | calculé |
| image_variant_1024 | Image de variante 1024 | image | related : |
| image_variant_128 | Image de variante 128 | image | related : |
| image_variant_1920 | Image de la variante | image | |
| image_variant_256 | Image de variante 256 | image | related : |
| image_variant_512 | Image de variante 512 | image | related : |
| import_attribute_values | Valeurs du produit | char | calculé |
| incoming_qty | Entrant Quantity of planned incoming products. In a context with a single Stock Location, this includes goods arriving to this Location, or any of its children. In a context with a single Warehouse, this includes goods arriving to the Stock Location of this Warehouse, or any of its children. Otherwise, this includes goods arriving to any Stock Location with 'internal' type. | float | calculé |
| invoice_state | Statut de la facture | selection | lecture seulecalculé Valeurs : ajouté par Margins by Products ( |
| is_favorite | Est favori | boolean | related : |
| is_kits | Est un kit | boolean | calculé ajouté par Fabrication ( |
| is_product_variant | Est une variante de produit | boolean | calculé |
| lot_properties_definition | Propriétés du lot | properties_definition | ajouté par Inventaire ( |
| lst_price | Prix de vente Le prix de vente peut être défini manuellement ou calculé à partir du modèle de produit. Cliquez sur le bouton "Configurer les variantes" pour définir les prix des attributs supplémentaires. | float | calculé, stocké |
| monthly_demand | Demande mensuelle | float | calculé ajouté par Purchase Stock ( |
| mrp_product_qty | Fabriqué | float | calculé ajouté par Fabrication ( |
| nbr_moves_in | Nbre d'entrées Nombre de mouvements entrants au cours des 12 derniers mois | integer | calculé ajouté par Inventaire ( |
| nbr_moves_out | Nbre de sorties Nombre de mouvements sortants au cours des 12 derniers mois | integer | calculé ajouté par Inventaire ( |
| nbr_reordering_rules | Règles de réapprovisionnement | integer | calculé ajouté par Inventaire ( |
| normal_cost | Coût normal Somme de la multiplication du prix de revient par la quantité dans les factures fournisseurs | float | calculé ajouté par Margins by Products ( |
| orderpoint_ids | Règles de stock minimum | one2many | inverse : ajouté par Inventaire ( |
| outgoing_qty | Sortant Quantity of planned outgoing products. In a context with a single Stock Location, this includes goods leaving this Location, or any of its children. In a context with a single Warehouse, this includes goods leaving the Stock Location of this Warehouse, or any of its children. Otherwise, this includes goods leaving any Stock Location with 'internal' type. | float | calculé |
| partner_ref | Réf. client | char | calculé |
| previously_bought_by_customer | Précédemment acheté par le client | boolean | ajouté par Ventes ( |
| price_extra | Prix supplémentaires des variantes Il s'agit de la somme des suppléments de prix de tous les attributs. | float | calculé |
| pricelist_rule_ids | Règles de liste de prix | one2many | calculé inverse : |
| product_document_count | Nombre de documents | integer | calculé |
| product_document_ids | Documents | one2many | inverse : |
| product_template_attribute_value_ids | Valeurs d'attribut | many2many | |
| product_template_image_ids | Product Template Image | one2many | related : ajouté par eCommerce ( |
| product_template_variant_value_ids | Attributs | many2many | |
| product_tmpl_id | Modèle de produit | many2one | requis |
| product_uom_ids | Code-barres de l'unité | one2many | inverse : |
| purchase_avg_price | Prix d'achat unitaire moyen Prix moyen dans les factures fournisseurs | float | calculé ajouté par Margins by Products ( |
| purchase_gap | Écart des achats Coût normal - Coût total | float | calculé ajouté par Margins by Products ( |
| purchase_num_invoiced | # facturé à l'achat Somme de la quantité dans les factures fournisseurs | float | calculé ajouté par Margins by Products ( |
| purchase_order_line_ids | Lignes de bon de commande | one2many | inverse : ajouté par Purchase Stock ( |
| purchased_product_qty | Acheté | float | calculé ajouté par Achats ( |
| putaway_rule_ids | Stratégies de rangement | one2many | inverse : ajouté par Inventaire ( |
| qty_available | Quantité disponible Current quantity of products. In a context with a single Stock Location, this includes goods stored at this Location, or any of its children. In a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children. stored in the Stock Location of the Warehouse of this Shop, or any of its children. Otherwise, this includes goods stored in any Stock Location with 'internal' type. | float | calculédépend de la société |
| reordering_max_qty | Qté de réapprovisionnement max. | float | calculé ajouté par Inventaire ( |
| reordering_min_qty | Qté de réapprovisionnement min. | float | calculé ajouté par Inventaire ( |
| sale_avg_price | Prix de vente unitaire moyen Prix moyen dans les factures clients. | float | calculé ajouté par Margins by Products ( |
| sale_expected | Vente attendue Somme de la multiplication du prix catalogue de vente par la quantité dans les factures clients | float | calculé ajouté par Margins by Products ( |
| sale_num_invoiced | # facturé à la vente Somme de la quantité dans les factures clients | float | calculé ajouté par Margins by Products ( |
| sales_count | Vendu | float | calculé ajouté par Ventes ( |
| sales_gap | Écart des ventes Vente attendue - Chiffre d'affaires | float | calculé ajouté par Margins by Products ( |
| show_forecasted_qty_status_button | Bouton d'Affichage de la Qté prévue | boolean | calculé ajouté par Inventaire ( |
| show_on_hand_qty_status_button | Montrer le Bouton de Statut Qté disponible | boolean | calculé ajouté par Inventaire ( |
| show_qty_update_button | Afficher le bouton de mise à jour des quantités | boolean | calculé ajouté par Inventaire ( |
| sold_by_vendor_id | Fournisseur | many2one | ajouté par Achats ( |
| standard_price | Coût Value of the product (automatically computed in AVCO). Used to value the product when the purchase cost is not known (e.g. inventory adjustment). Used to compute margins on sale orders. | float | dépend de la société |
| stock_move_ids | Mouvement de stock | one2many | inverse : ajouté par Inventaire ( |
| stock_quant_ids | Quant de stock | one2many | inverse : ajouté par Inventaire ( |
| storage_category_capacity_ids | Capacité de la catégorie d'emplacement | one2many | inverse : ajouté par Inventaire ( |
| suggest_estimated_price | Proposer un prix estimé | float | calculé ajouté par Purchase Stock ( |
| suggested_qty | Quantité suggérée | integer | calculé ajouté par Purchase Stock ( |
| tax_string | String fiscal | char | calculé ajouté par Facturation ( |
| total_cost | Coût total Sum of Multiplication of Invoice price and quantity of Vendor Bills | float | calculé ajouté par Margins by Products ( |
| total_margin | Marge totale Chiffre d'affaires - Coût total | float | calculé ajouté par Margins by Products ( |
| total_margin_rate | Taux de marge totale (%) Marge totale * 100 / chiffre d'affaires | float | calculé ajouté par Margins by Products ( |
| total_value | Valeur totale | monetary | calculé ajouté par WMS Accounting ( |
| turnover | Chiffre d'affaires Somme de la multiplication du prix facturé par la quantité dans les factures clients | float | calculé ajouté par Margins by Products ( |
| used_in_bom_count | # Nomenclatures où utilisé | integer | calculé ajouté par Fabrication ( |
| valid_ean | Le code-barres est valide EAN | boolean | calculé ajouté par Inventaire ( |
| variant_bom_ids | Nomenclatures des variantes de produit | one2many→ mrp.bom | inverse : ajouté par Fabrication ( |
| variant_image_ids | Variant Extra Images | many2many | calculé, stocké ajouté par eCommerce ( |
| variant_ribbon_id | Ruban de variante | many2one | ajouté par eCommerce ( |
| virtual_available | Quantité prévue Forecast quantity (computed as Quantity On Hand - Outgoing + Incoming - Quantity to Remove) In a context with a single Stock Location, this includes goods stored in this location, or any of its children. In a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children. Otherwise, this includes goods stored in any Stock Location with 'internal' type. | float | calculé |
| volume | Volume | float | |
| website_id | Site Web | many2one | related : ajouté par eCommerce ( |
| website_url | URL de site web L'URL complète pour accéder au document à travers le site web. | char | calculé ajouté par eCommerce ( |
| weight | Poids | float | |
| write_date | Date de rédaction | datetime | calculé, stocké |
| activity_calendar_event_id | Activité suivante de l'événement du calendrier | many2one | calculé hérité de mail.activity.mixin |
| activity_date_deadline | Date limite de l'activité à venir | date | lecture seulecalculé hérité de mail.activity.mixin |
| activity_exception_decoration | Indicateur d’exception d’activité Type d'activité d'exception enregistrée. | selection | calculé Valeurs : hérité de mail.activity.mixin |
| activity_exception_icon | Icône Icône pour indiquer une activité d'exception. | char | calculé hérité de mail.activity.mixin |
| activity_ids | Activités | one2many | inverse : hérité de mail.activity.mixin |
| activity_plans_ids | Plans d'activité | many2many | calculé hérité de mail.activity.mixin |
| activity_state | Statut de l'activité Status based on activities Overdue: Due date is already passed Today: Activity date is today Planned: Future activities. | selection | calculé Valeurs : hérité de mail.activity.mixin |
| activity_summary | Résumé de l'activité suivante | char | related : hérité de mail.activity.mixin |
| activity_type_icon | Icône de type d'activité | char | related : hérité de mail.activity.mixin |
| activity_type_id | Type d'activités à venir | many2one | related : hérité de mail.activity.mixin |
| activity_user_id | Utilisateur responsable | many2one | lecture seulecalculé hérité de mail.activity.mixin |
| has_message | A un message | boolean | calculé hérité de mail.thread |
| message_attachment_count | Nombre de pièces jointes | integer | calculé hérité de mail.thread |
| message_follower_ids | Abonnés | one2many | inverse : hérité de mail.thread |
| message_has_error | Erreur d'envoi du message Si coché, certains messages ont une erreur de livraison. | boolean | calculé hérité de mail.thread |
| message_has_error_counter | Nombre d'erreurs Nombre de messages avec des erreurs d'envoi | integer | calculé hérité de mail.thread |
| message_has_sms_error | Erreur d'envoi SMS Si coché, certains messages ont une erreur de livraison. | boolean | calculé hérité de mail.thread |
| message_ids | Messages | one2many | inverse : hérité de mail.thread |
| message_is_follower | Est un abonné | boolean | calculé hérité de mail.thread |
| message_needaction | Nécessite une action Si coché, de nouveaux messages demandent votre attention. | boolean | calculé hérité de mail.thread |
| message_needaction_counter | Nombre d'actions Nombre de messages nécessitant une action | integer | calculé hérité de mail.thread |
| message_partner_ids | Abonnés (Partenaires) | many2many | calculé hérité de mail.thread |
| my_activity_date_deadline | Échéance de mon activité | date | lecture seulecalculé hérité de mail.activity.mixin |
| rating_ids | Évaluations | one2many | inverse : hérité de mail.thread |
| create_date | Créé le | datetime | lecture seuleautomatique |
| create_uid | Créé par | many2one | lecture seuleautomatique |
| display_name | Nom affiché | char | lecture seulecalculéautomatique |
| id | ID | integer | lecture seuleautomatique |
| write_uid | Dernière mise à jour par | many2one | lecture seuleautomatique |
Relations
Modèles liés depuis ce modèle
- event.event.ticket : event_ticket_ids
- hr.expense.product.job.position.limit : expense_job_position_limit_ids
- mrp.bom : variant_bom_ids
- mrp.bom.line : bom_line_ids
- product.base.unit : base_unit_id
- product.document : gelato_variant_image_ids, product_document_ids
- product.image : product_template_image_ids, variant_image_ids
- product.pricelist.item : pricelist_rule_ids
- product.ribbon : variant_ribbon_id
- product.tag : additional_product_tag_ids, all_product_tag_ids
- product.template : product_tmpl_id
- product.template.attribute.value : product_template_attribute_value_ids, product_template_variant_value_ids
- product.uom : product_uom_ids
- purchase.order.line : purchase_order_line_ids
- res.country : country_of_origin
- res.currency : company_currency_id
- res.partner : sold_by_vendor_id
- slide.channel : channel_ids
- stock.move : stock_move_ids
- stock.putaway.rule : putaway_rule_ids
- stock.quant : stock_quant_ids
- stock.storage.category.capacity : storage_category_capacity_ids
- stock.warehouse.orderpoint : orderpoint_ids
- uom.uom : extra_uom_ids
Champs d'autres modèles qui pointent ici
- account.analytic.distribution.model : product_id
- account.analytic.line : product_id
- account.invoice.report : product_id
- account.move.line : product_id
- customer.product.reference : product_id
- delivery.carrier : product_id
- delivery.note.wizard.line : product_id
- event.booth.category : product_id
- event.booth.configurator : product_id
- event.event.configurator : additional_product_ids, product_id
- event.sale.report : product_id
- event.type.booth : product_id
- event.type.ticket : additional_product_ids, product_id
- hr.expense : product_id
- hr.expense.product.job.position.limit : product_id
- hr.expense.split : product_id
- loyalty.program : payment_program_discount_product_id, trigger_product_ids
- loyalty.reward : all_discount_product_ids, discount_line_product_id, discount_product_ids, reward_product_id, reward_product_ids
- loyalty.rule : product_ids, valid_product_ids
- mrp.bom : product_id
- mrp.bom.byproduct : product_id
- mrp.bom.line : product_id
- mrp.consumption.warning.line : product_id
- mrp.production : bom_product_ids, product_id
- mrp.production.split : product_id
- mrp.unbuild : product_id
- mrp.workcenter.capacity : product_id
- mrp.workorder : product_id
- pos.config : default_product_id, discount_product_id, down_payment_product_id, tip_product_id
- pos.order.line : product_id
- pos.pack.operation.lot : product_id
- pos.prep.line : product_id
- pos.preset : delivery_product_id, service_fee_product_id
- product.catalog.line.mixin : product_id
- product.combo.item : product_id
- product.label.layout : product_ids
- product.pricelist.item : product_id
- product.replenish : product_id
- product.stock.notification : product_id
- product.supplierinfo : product_id
- et 45 autres
Lire ce modèle par l'API
Exemple d'appel à l'API JSON-2 d'Odoo 20 : lecture des cinq premiers enregistrements avec des champs réels du modèle. Remplacez l'instance, la base et la clé API par les vôtres.
curl -X POST "https://votre-instance.odoo.com/json/2/product.product/search_read" \
-H "Authorization: bearer $ODOO_API_KEY" \
-H "X-Odoo-Database: votre-base" \
-H "Content-Type: application/json" \
-d '{"domain":[],"fields":["base_unit_count","product_tmpl_id","base_unit_id","country_of_origin","sold_by_vendor_id"],"limit":5}'import requests
BASE_URL = "https://votre-instance.odoo.com/json/2"
headers = {"Authorization": f"bearer {API_KEY}", "X-Odoo-Database": "votre-base"}
res = requests.post(
f"{BASE_URL}/product.product/search_read",
headers=headers,
json={"domain": [], "fields": ["base_unit_count","product_tmpl_id","base_unit_id","country_of_origin","sold_by_vendor_id"], "limit": 5},
)
res.raise_for_status()
print(res.json())- L'accès à l'API externe est réservé à la formule Custom d'Odoo.
- XML-RPC et JSON-RPC seront retirés dans Odoo 22 (automne 2028) : préférez JSON-2.
- Les droits d'accès et règles d'enregistrement de l'utilisateur de la clé s'appliquent.
Citer cet outil
Vous rédigez un tutoriel, une documentation interne ou une réponse sur un forum ? Copiez ce lien pour renvoyer vos lecteurs vers la fiche à jour.
<a href="https://aidoo.ai/fr/outils/explorateur-modeles-odoo/product-product">product.product (Odoo 20.0)</a>Sources
- Code source du modèle sur GitHub
- Documentation Odoo 20 : ORM API
- Documentation Odoo 20 : API externe JSON-2
Données vérifiées le 25 septembre 2026 · Odoo 20.0 Community
Vous avez un projet Odoo ou souhaitez exploiter votre ERP avec l'IA ? Échangeons
Intégration, développement de modules, connexion de Claude ou ChatGPT à vos données : décrivez-nous votre contexte, nous vous répondons sous 24 heures ouvrées.