Tuto Odoo : utilisation de read_group dans une boucle for
Après notre focus sur Odoo et son intégration, notre Elosien Seif partage avec vous une astuce pour utiliser la méthode read_group dans une boucle for.
La méthode read_group est utilisée pour regrouper des enregistrements en fonction de certains critères et pour calculer des sommes, moyennes ou autres agrégations sur les groupes formés.
Toutefois, comme pour search, l’exécution de read_group à l’intérieur d’une boucle for peut entraîner de nombreuses requêtes SQL coûteuses.
Exemple inefficace
Supposons que nous ayons un modèle sale.order.line et que nous souhaitons calculer la quantité totale vendue pour chaque produit dans chaque commande. Une approche naïve pourrait ressembler à ceci :
for order in self:
total_quantities = self.env[‘sale.order.line’].read_group(
[(‘order_id’, ‘=’, order.id)],
[‘product_id’, ‘product_uom_qty:sum’],
[‘product_id’]
)
# Faire quelque chose avec les quantités totales
Dans cet exemple, pour chaque commande, une requête SQL distincte est exécutée pour regrouper et sommer les quantités des lignes de commande associées à cette commande. Si self contient 1000 commandes, cela entrainera 1000 requêtes read_group distinctes.
Exemple optimisé
Utiliser read_group pour pré-agréger les données.
Une approche beaucoup plus efficace consiste à effectuer une seule requête read_group pour pré-agréger les données pour toutes les commandes, puis à organiser les résultats de manière à permettre un accès rapide :
# Récupérer tous les IDs des commandes
order_ids = self.ids
# Utiliser read_group pour regrouper et sommer les quantités par produit pour toutes les commandes
total_quantities = self.env[‘sale.order.line’].read_group(
[(‘order_id’, ‘in’, order_ids)],
[‘order_id’, ‘product_id’, ‘product_uom_qty:sum’],
[‘order_id’, ‘product_id’]
)
# Organiser les résultats par commande et produit
quantities_by_order = {}
for result in total_quantities:
order_id = result[‘order_id’][0]
product_id = result[‘product_id’][0]
qty = result[‘product_uom_qty’]
if order_id not in quantities_by_order:
quantities_by_order[order_id] = {}
quantities_by_order[order_id][product_id] = qty
# Boucler sur les commandes et traiter les quantités agrégées
for order in self:
order_quantities = quantities_by_order.get(order.id, {})
# Faire quelque chose avec les quantités agrégées pour chaque produit dans la commande
Elosi est partenaire Odoo
Le saviez-vous ? Elosi est officiellement partenaire Odoo.
Cette année c’est 6 elosiens qui ont obtenu leur certification Odoo. Pourquoi pas vous ? Rendez-vous sur elosi/carriere.