Insérer dans Many2Many Odoo (Ancien Openderp)
-
28-10-2019 - |
Question
J'essaie d'insérer des valeurs dans une table de relation Many2Many ou One2manhy dans Odoo (ancien OpenderP). Avez-vous une idée de comment faire cela?
La solution
Voici un exemple du module de stock:
invoice_line_id = invoice_line_obj.create(cursor, user, {
'name': name,
'origin': origin,
'invoice_id': invoice_id,
'uos_id': uos_id,
'product_id': move_line.product_id.id,
'account_id': account_id,
'price_unit': price_unit,
'discount': discount,
'quantity': move_line.product_uos_qty or move_line.product_qty,
'invoice_line_tax_id': [(6, 0, tax_ids)],
'account_analytic_id': account_analytic_id,
}, context=context)
self._invoice_line_hook(cursor, user, move_line, invoice_line_id)
La invoice_line_tax_id
le terrain est une relation plusieurs à plusieurs, et le (6, 0, tax_ids)
signifie remplacer tous les enregistrements existants par ceux qui tax_ids
. Parce que tu appelles create()
, il n'y a rien à remplacer.
Une liste complète des options est dans le Documentation pour la classe OSV.
Pour un champ Many2Many, une liste de tuples est attendue. Voici la liste des tuple qui sont acceptés, avec la sémantique correspondante
(0, 0, { values })
lien vers un nouvel enregistrement qui doit être créé avec le dictionnaire de valeurs donné
(1, ID, { values })
Mettez à jour l'enregistrement lié avec id = id (écrire valeurs dessus)
(2, ID)
Supprimez et supprimez l'enregistrement lié avec id = id (appelle le link sur id, qui supprimera complètement l'objet, et le lien vers lui aussi)
(3, ID)
Coupez le lien vers l'enregistrement lié avec id = id (supprimez la relation entre les deux objets mais ne supprime pas l'objet cible lui-même)
(4, ID)
lien vers l'enregistrement existant avec id = id (ajoute une relation)
(5)
Désabillez tout (comme utiliser (3, id) pour tous les enregistrements liés)
(6, 0, [IDs])
Remplacez la liste des ID liés (comme l'utilisation (5) puis (4, ID) pour chaque ID dans la liste des ID)
Autres conseils
def list_customers(self, cr, uid, ids, context):
sale_obj = self.pool.get('sale.order')
for sale in self.browse(cr, uid, ids, context):
sale_ids = sale_obj.search(cr, uid, [('div_code_id','=',sale.div_code_id.id),('project_user','=',sale.project_id.id),('tower_id','=',sale.tower_id.id)])
ids_cus = []
for cus in sale_obj.browse(cr, uid, sale_ids, context):
if cus.partner_id.id not in ids_cus:
ids_cus.append(cus.partner_id.id)
self.write(cr, uid, ids, {'state_readonly':'listed','customer_ids': [(6, 0, ids_cus)]})
return True
Vous pouvez insérer des valeurs dans un tableau de relations multiples à plusieurs dans OpenderP, veuillez consulter l'exemple ci-dessus
Lorsque nous créons le champ Many2Many, nous avons utilisé cette syntaxe:
'field_name':fields.many2many('Module_name','relation_name','self_id','module_name_id','string',
Maintenant, vous devez vous insérer dans cette relation en exécutant des requêtes comme:
$ cr.execute('insert into relation_name (self_id,module_name_id) values(%s,%s)',(first_value,second_value)
Mettez simplement votre champ Many2Many en vue (fichier XML) et après avoir exécuté votre module, vous pouvez voir un champ Many2Many pour insérer des enregistrements dans votre GUI