web-dev-qa-db-fra.com

insérer dans many2many odoo (ancien openerp)

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

22
m3asmi

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)

41
Don Kirkby
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.

7
MKUMAR

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)
3
Anup

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.

0
Sudhir Arya