J'essaie d'insérer des valeurs dans une table de relations many2many ou one2manhy dans odoo (ancien OpenERP). Avez-vous une idée de comment faire cela?
Merci
Voici un exemple tiré du module 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)
Le champ invoice_line_tax_id
est une relation plusieurs à plusieurs et le (6, 0, tax_ids)
signifie remplacer tous les enregistrements existants par ceux de tax_ids
. Comme vous appelez create()
, il n’ya rien à remplacer.
La liste complète des options se trouve dans la documentation de la classe osv .
Pour un champ many2many, une liste de tuples est attendue. Voici la liste des tuple 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 })
met à jour l'enregistrement lié avec id = ID (écrivez values dessus)
(2, ID)
supprime et supprime l'enregistrement lié avec id = ID (les appels non liés sur ID, qui suppriment complètement l'objet, ainsi que son lien)
(3, ID)
coupe le lien vers l'enregistrement lié avec id = ID (supprime 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)
dissocier tout (comme utiliser (3, ID) pour tous les enregistrements liés)
(6, 0, [IDs])
remplace la liste des identifiants liés (comme avec (5) puis (4, identifiant) pour chaque identifiant de la liste des identifiants)
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 une table de relations plusieurs-à-plusieurs dans OpenERP. Veuillez consulter l'exemple ci-dessus.
Lorsque nous créons le champ many2many, nous utilisons cette syntaxe:
'field_name':fields.many2many('Module_name','relation_name','self_id','module_name_id','string',
Maintenant, vous devez insérer dans cette relation en exécutant des requêtes telles que:
$ cr.execute('insert into relation_name (self_id,module_name_id) values(%s,%s)',(first_value,second_value)
Il suffit de mettre votre champ many2many en vue (fichier xml) et après avoir exécuté votre module, vous pouvez voir le champ many2many permettant d'insérer des enregistrements dans votre gui.