Définir les modèles
Dans Odoo, les modèles, également connus sous le nom de classes de modèle, sont des composants essentiels pour la définition de la structure des données et de la logique métier d’une application. Les modèles sont définis dans les modules Odoo et représentent des entités telles que des objets, des tables de base de données ou des documents.
La classe de modèle est déclarée en utilisant le décorateur @api.model
ou en héritant de la classe de base odoo.models.Model
. Les modèles définissent les champs, les méthodes, les relations et les comportements spécifiques de l’entité qu’ils représentent. Voici quelques éléments importants que vous pouvez trouver dans la définition d’un modèle :
- Champs : Les champs sont les attributs qui définissent les propriétés et les données d’un modèle. Les types de champs couramment utilisés incluent
Char
(chaîne de caractères),Integer
(entier),Float
(nombre décimal),Boolean
(booléen),Date
(date),Datetime
(date et heure),Selection
(sélection de choix), etc. - Méthodes : Les méthodes sont des fonctions définies à l’intérieur de la classe de modèle. Elles sont utilisées pour implémenter la logique métier spécifique au modèle. Par exemple, vous pouvez définir des méthodes pour effectuer des calculs, des validations, des actions ou des opérations spécifiques liées aux données du modèle.
- Relations : Les relations sont des liens entre différents modèles. Elles permettent d’établir des liens logiques et de récupérer des informations d’autres modèles. Les types de relations couramment utilisés incluent
Many2one
(relation vers un modèle parent),One2many
(relation vers plusieurs modèles enfants) etMany2many
(relation de nombreux-à-plusieurs). - Contraintes : Les contraintes sont des règles qui sont appliquées lors de la création ou de la modification des enregistrements du modèle. Elles sont utilisées pour valider les données et garantir l’intégrité des données. Par exemple, vous pouvez définir une contrainte pour s’assurer qu’un champ obligatoire est renseigné ou qu’une valeur respecte certaines conditions.
Les modèles Odoo offrent une flexibilité et une puissance considérables pour définir la structure des données et la logique métier d’une application. Ils permettent de manipuler, de rechercher, de créer et de modifier des enregistrements dans la base de données, ainsi que d’interagir avec d’autres modèles et de mettre en œuvre des fonctionnalités spécifiques.
Il est important de bien comprendre la structure et les fonctionnalités des modèles dans Odoo pour développer efficacement des applications personnalisées ou étendre les fonctionnalités existantes d’Odoo. La documentation officielle d’Odoo fournit des informations détaillées sur la création et l’utilisation des modèles.
Les modèles peuvent être configurés en définissant un certain nombre d’attributs lors de leur définition. L’attribut le plus important est _name qui est obligatoire et définit le nom du modèle dans le système Odoo. Voici une définition minimale complète d’un modèle :
from odoo import models class MinimalModel(models.Model): _name = 'test.model'
Voici un exemple qui illustre l’utilisation de différents types de champs dans Odoo :
from odoo import models, fields
class ExampleModel(models.Model):
_name = 'example.model'
name = fields.Char(string='Name', required=True)
age = fields.Integer(string='Age')
salary = fields.Float(string='Salary')
is_employee = fields.Boolean(string='Is Employee')
birthdate = fields.Date(string='Birthdate')
created_at = fields.Datetime(string='Created At')
status = fields.Selection([
('draft', 'Draft'),
('in_progress', 'In Progress'),
('done', 'Done')
], string='Status', default='draft')
category_ids = fields.Many2many('example.category', string='Categories')
parent_id = fields.Many2one('example.model', string='Parent')
child_ids = fields.One2many('example.model', 'parent_id', string='Children')
class ExampleCategory(models.Model):
_name = 'example.category'
name = fields.Char(string='Name')
Dans cet exemple, nous avons défini un modèle ExampleModel
avec différents types de champs :
Char
: Le champname
est une chaîne de caractères (texte) et est requis (required=True
).Integer
: Le champage
est un entier.Float
: Le champsalary
est un nombre décimal.Boolean
: Le champis_employee
est un booléen, qui indique si la personne est employée ou non.Date
: Le champbirthdate
est une date.Datetime
: Le champcreated_at
est une date et heure.Selection
: Le champstatus
est une sélection de choix avec les valeurs ‘draft’, ‘in_progress’ et ‘done’.Many2many
: Le champcategory_ids
établit une relation de nombreux-à-plusieurs avec le modèleexample.category
, permettant de lier plusieurs catégories à un enregistrement.Many2one
: Le champparent_id
établit une relation vers un enregistrement parent du même modèle.One2many
: Le champchild_ids
établit une relation vers plusieurs enregistrements enfants du même modèle.
Notez que dans cet exemple, nous avons également défini un modèle ExampleCategory
pour illustrer la relation Many2many
avec le modèle ExampleModel
.
Cet exemple couvre différentes possibilités de types de champs dans Odoo. Vous pouvez utiliser ces types de champs en fonction de vos besoins métier spécifiques et de la structure des données de votre application.
Les relations Many2many
, One2many
et Many2one
sont des types de relations utilisés pour établir des liens entre différents modèles dans Odoo. Voici une explication détaillée de chaque type de relation :
- Relation
Many2many
:
- Utilisation : Cette relation est utilisée lorsqu’il y a une relation de nombreux-à-plusieurs entre deux modèles. Par exemple, une personne peut appartenir à plusieurs groupes et un groupe peut contenir plusieurs personnes.
- Déclaration : Pour déclarer une relation
Many2many
, vous devez utiliser le champMany2many
et spécifier le modèle cible avec lequel vous voulez établir la relation. - Exemple :
category_ids = fields.Many2many('example.category', string='Categories')
- Dans cet exemple, le champ
category_ids
du modèleExampleModel
établit une relationMany2many
avec le modèleexample.category
, permettant à un enregistrement deExampleModel
d’appartenir à plusieurs catégories.
- Relation
One2many
:
- Utilisation : Cette relation est utilisée lorsqu’il y a une relation de un-à-plusieurs entre deux modèles. Par exemple, un projet peut avoir plusieurs tâches liées.
- Déclaration : Pour déclarer une relation
One2many
, vous devez utiliser le champOne2many
et spécifier le modèle cible avec lequel vous voulez établir la relation. Vous devez également spécifier le champ inverse sur le modèle cible pour lier les enregistrements. - Exemple :
task_ids = fields.One2many('project.task', 'project_id', string='Tasks')
- Dans cet exemple, le champ
task_ids
du modèleProject
établit une relationOne2many
avec le modèleproject.task
, en utilisant le champproject_id
sur le modèle cible pour lier les enregistrements. Cela permet à un projet d’avoir plusieurs tâches liées.
- Relation
Many2one
:
- Utilisation : Cette relation est utilisée lorsqu’il y a une relation de plusieurs-à-un entre deux modèles. Par exemple, une tâche peut être liée à un projet spécifique.
- Déclaration : Pour déclarer une relation
Many2one
, vous devez utiliser le champMany2one
et spécifier le modèle cible avec lequel vous voulez établir la relation. - Exemple :
project_id = fields.Many2one('project.project', string='Project')
- Dans cet exemple, le champ
project_id
du modèleTask
établit une relationMany2one
avec le modèleproject.project
, permettant de lier une tâche à un projet spécifique.
Ces types de relations sont essentiels pour modéliser les relations complexes entre les différentes entités d’une application Odoo. En utilisant ces relations, vous pouvez établir des liens logiques et récupérer des informations d’autres modèles, ce qui facilite la manipulation et l’organisation des données dans Odoo.
Champs du modèle
Les champs sont utilisés pour définir ce que le modèle peut stocker et où. Les champs sont définis comme des attributs de la classe de modèle :
from odoo import models, fields class LessMinimalModel(models.Model): _name = 'test.model2' name = fields.Char()
Attributs communs
Tout comme le modèle lui-même, ses champs peuvent être configurés en passant des attributs de configuration en tant que paramètres :
name = fields.Char(required=True)
Dans Odoo, il existe certains attributs communs qui peuvent être utilisés lors de la définition des champs d’un modèle. Ces attributs fournissent des fonctionnalités supplémentaires et permettent de personnaliser le comportement des champs. Voici quelques-uns des attributs communs les plus couramment utilisés :
string
: Cet attribut permet de définir l’étiquette ou le libellé associé à un champ. Il est utilisé pour afficher un texte descriptif dans l’interface utilisateur d’Odoo. Par exemple :name = fields.Char(string='Name')
.required
: Cet attribut indique si le champ est obligatoire lors de la création ou de la modification d’un enregistrement. Lorsquerequired=True
, le champ doit être renseigné. Par défaut,required
est défini sur False. Par exemple :name = fields.Char(string='Name', required=True)
.readonly
: Cet attribut spécifie si le champ est en lecture seule, ce qui signifie qu’il ne peut pas être modifié. Lorsquereadonly=True
, le champ est affiché en tant que valeur non modifiable dans l’interface utilisateur. Par défaut,readonly
est défini sur False. Par exemple :name = fields.Char(string='Name', readonly=True)
.default
: Cet attribut permet de définir une valeur par défaut pour un champ lors de la création d’un nouvel enregistrement. La valeur par défaut peut être une valeur statique ou une fonction qui renvoie une valeur. Par exemple :name = fields.Char(string='Name', default='Default Name')
.compute
: Cet attribut permet de définir une fonction de calcul pour le champ. La fonction de calcul est exécutée chaque fois que la valeur du champ est accédée. Elle est utilisée pour calculer dynamiquement la valeur du champ en fonction d’autres champs ou de la logique métier. Par exemple :
def _compute_total_amount(self):
for record in self:
record.total_amount = record.price * record.quantity
total_amount = fields.Float(string='Total Amount', compute='_compute_total_amount')
inverse
: Cet attribut permet de définir une fonction inverse pour le champ. La fonction inverse est appelée lorsque la valeur du champ est modifiée et permet de mettre à jour d’autres champs ou de réaliser des actions spécifiques en fonction de cette modification. Par exemple :
def _inverse_total_amount(self):
for record in self:
record.price = record.total_amount / record.quantity
total_amount = fields.Float(string='Total Amount', compute='_compute_total_amount', inverse='_inverse_total_amount')
store
: Cet attribut indique si la valeur du champ doit être stockée dans la base de données. Par défaut,store
est défini sur True. Cependant, pour les champs calculés (compute
),store
doit être défini sur False, car ils sont automatiquement calculés à partir d’autres champs et n’ont pas besoin d’être stockés.
Ces attributs communs permettent de personnaliser le comportement des champs et d’ajouter des fonctionnalités supplémentaires à votre modèle dans Odoo. Vous pouvez utiliser ces attributs en fonction des besoins spécifiques de votre application pour rendre vos champs plus interactifs, dynamiques et personnalisés.
Activité : Création d’un modèle de gestion des patients d’un hôpital
- Créez un modèle appelé
Hospital
Patient pour gérer les informations des patients dans un hôpital.
from odoo import api,models, fields
class HospitalPatient(models.Model):
_name = 'hospital.patient'
Activité : Création d’un modèle de gestion des patients d’un hôpital
- Ajouter le champs ‘name’ au model « patient »
name = fields.Char(string='Name',required=True)
- Mettre à jour l’application
- Verifier l’ajout de du champs dans la base de données
Activité : Création d’un modèle de gestion des patients d’un hôpital
- Ajouter la description du model « patient »
_description = "Patient Records"
- Mettre à jour l’apllication
- Verifier la modification dans la base de données
Activité : Création d’un modèle de gestion des patients d’un hôpital
- Ajouter les champs ‘age’,’is child’ et ‘gender’ au model « patient »
age = fields.Integer(string='Age')
is_child = fields.Boolean(string='Is Child ?')
notes = fileds.Text(string='Notes')
gender = fields.Selection([('male','Male'),('female','Female')],string='Gender')
- Mettre à jour l’apllication
- Vérifier l’ajout des champs dans la base de données
Voici l’intégralité du code avec la correction des fautes de frappe :
from odoo import api, models, fields
class HospitalPatient(models.Model):
_name = 'hospital.patient'
name = fields.Char(string='Name', required=True)
_description = "Patient Records"
age = fields.Integer(string='Age')
is_child = fields.Boolean(string='Is Child?')
notes = fields.Text(string='Notes')
gender = fields.Selection([('male', 'Male'), ('female', 'Female')], string='Gender')
Ce code importe les classes nécessaires d’Odoo (api
, models
, fields
) et définit un modèle Odoo appelé HospitalPatient
.
Le modèle HospitalPatient
hérite de la classe models.Model
d’Odoo, ce qui permet de créer une nouvelle table dans la base de données pour stocker les enregistrements des patients.
Les champs du modèle sont définis comme suit :
name
: champ de typeChar
qui stocke le nom du patient. Il est obligatoire (required=True
)._description
: attribut de chaîne de caractères qui fournit une description du modèle. Dans ce cas, il est défini comme « Patient Records ».age
: champ de typeInteger
qui stocke l’âge du patient.is_child
: champ de typeBoolean
qui indique si le patient est un enfant ou non.notes
: champ de typeText
qui stocke des notes ou des commentaires sur le patient.gender
: champ de typeSelection
qui stocke le genre du patient. Il offre deux options : « Male » (masculin) et « Female » (féminin).
Ce code permet de créer un modèle de base pour enregistrer les informations des patients dans Odoo, telles que leur nom, leur âge, leur statut d’enfant ou d’adulte, leurs notes et leur genre.