Odoo Help

Welcome!

This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.

0

how do i save a m2m field?

By
AJ Schrafel Paper Corp
on 4/23/13, 5:42 PM 2,847 views

I would like to select and save a group of partners as a many2many field, and then use that field to generate a set of actions. I can get the XML to display and select the partners that i want to save, but i cannot get the m2m field to write in the database. I know that i have to write a create function to save the m2m relationship in my custom module, but i cannot figure out what i am doing wrong.

Can someone please point me to an example of how to write a create function?

I am getting the following error:

    Client Traceback (most recent call last):
  File "/opt/openerp/web/addons/web/http.py", line 204, in dispatch
    response["result"] = method(self, **self.params)
  File "/opt/openerp/web/addons/web/controllers/main.py", line 1129, in call_kw
    return self._call_kw(req, model, method, args, kwargs)
  File "/opt/openerp/web/addons/web/controllers/main.py", line 1121, in _call_kw
    return getattr(req.session.model(model), method)(*args, **kwargs)
  File "/opt/openerp/web/addons/web/session.py", line 43, in proxy
    result = self.proxy.execute_kw(self.session._db, self.session._uid, self.session._password, self.model, method, args, kw)
  File "/opt/openerp/web/addons/web/session.py", line 31, in proxy_method
    result = self.session.send(self.service_name, method, *args)
  File "/opt/openerp/web/addons/web/session.py", line 104, in send
    raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info)


Server Traceback (most recent call last):
  File "/opt/openerp/web/addons/web/session.py", line 90, in send
    return openerp.netsvc.dispatch_rpc(service_name, method, args)
  File "/opt/openerp/server/openerp/netsvc.py", line 293, in dispatch_rpc
    result = ExportService.getService(service_name).dispatch(method, params)
  File "/opt/openerp/server/openerp/service/web_services.py", line 626, in dispatch
    res = fn(db, uid, *params)
  File "/opt/openerp/server/openerp/osv/osv.py", line 188, in execute_kw
    return self.execute(db, uid, obj, method, *args, **kw or {})
  File "/opt/openerp/server/openerp/osv/osv.py", line 131, in wrapper
    return f(self, dbname, *args, **kwargs)
  File "/opt/openerp/server/openerp/osv/osv.py", line 197, in execute
    res = self.execute_cr(cr, uid, obj, method, *args, **kw)
  File "/opt/openerp/server/openerp/osv/osv.py", line 185, in execute_cr
    return getattr(object, method)(cr, uid, *args, **kw)
  File "/opt/openerp/server/openerp/osv/orm.py", line 4148, in write
    for sub_ids in cr.split_for_in_conditions(ids):
  File "/opt/openerp/server/openerp/sql_db.py", line 258, in split_for_in_conditions
    return tools.misc.split_every(self.IN_MAX, set(ids))
TypeError: unhashable type: 'dict'

How do i properly save a m2m field?

Here is my test code:

m2m_test.py

import netsvc
import tools
import time 
from osv import fields
from osv import osv
import pooler 
import tools
from tools.translate import _
from base_calendar import base_calendar
import logging

#
#  
#

class m2m_test(osv.osv):
    _name = "m2m.test"
    _description = "Many2Many Test"

    _columns = {
        'name' : fields.char('M2M Test',size=64,required=True,select="1"),
        'partner_id': fields.related('partner_id', select=True, type= 'many2many', relation='res.partner', string='Customer'),
    }

    _defaults = {
    }

    def create(self, cr, uid, values, context=None):
        if context is None:
            context = {}
        newid = values
        return newid

o2m_test()

m2m_test.xml

<?xml version="1.0"?>
<openerp>
<data>

    <menuitem name="Many2Many TEST" id="menu_m2m_test_main" parent="base.menu_config"/>

    <record model="ir.ui.view" id="view_m2m_test_form">
        <field name="name">m2m.test.form</field>
        <field name="model">m2m.test</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
            <form string="Many 2 Many Test" version="7.0">
                <sheet>
                    <group>
                        <field name="name"/>
                    </group>
                    <group>
                        <field name="partner_id" widget="many2many">
                            <tree>
                                <field name="name"/>
                                <field name="fax"/>                                
                            </tree>
                        </field>
                    </group>
                </sheet>
            </form>
        </field>
    </record>

    <record model="ir.ui.view" id="view_m2m_test_tree">
        <field name="name">m2m.test.tree</field>
        <field name="model">m2m.test</field>
        <field name="type">form</field>
        <field name="arch" type="xml">
            <tree string="Many2 Many Test" >
                <field name="name"/>
            </tree>
        </field>
    </record>

    <record model="ir.actions.act_window" id="action_m2m_test_form">
        <field name="name">Many 2 Many Test</field>
        <field name="type">ir.actions.act_window</field>
        <field name="res_model">m2m.test</field>
        <field name="view_type">form</field>
        <field name="view_mode">tree,form</field>
        <field name="auto_refresh">20</field>
        <field name="help" type="html">
            <p class="oe_view_nocontent_create">
                Click to define a new Many2Many Test
            </p>
        </field>
    </record>

    <menuitem name="Many 2 Many Test" 
        id="menu_m2m_test_form" 
        parent="menu_m2m_test_main" 
        action="action_m2m_test_form"/>
</data>
</openerp>
0

AJ Schrafel Paper Corp

--AJ Schrafel Paper Corp--
2050
| 4 5 8
Bronx, United States
--AJ Schrafel Paper Corp--

Exploring OpenERP for business

AJ Schrafel Paper Corp
On 4/24/13, 5:39 PM

I figured it out:

You must have a bidirectional relationship between the two fields you want a M2M relationship with and the id1-id2 names are just place holders.

class o2m_test(osv.osv):
    _name = "o2m.test"
    _description = "One2Many Test"

    _columns = {
        'name' : fields.char('O2M Test',size=64,required=True,select="1"),
        'partner_ids': fields.many2many('res.partner', id1='category_id', id2='partner_id', string='Partners'),

    }

    _defaults = {
    }

o2m_test()

class res_partner(osv.osv):
    _inherit = "res.partner"
    _columns = {
        'fax_ids': fields.many2many('o2m.test', id1='partner_id', id2='category_id', string='Tags'),
    }

res_partner()
1
Dharmesh Rathod
On 4/24/13, 2:38 AM

Hi,

There is problem in 'related' field syntax.

'partner_id':fields.many2one('res.partner', 'Partner'),

'NEW_FIELD_NAME': fields.related('partner_id','MANY2MANY FIELD', type='many2many', relation='RELATED MODEL', string='LABEL'),

Email : info@acespritech.com
Skype : acespritech

Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

0 follower(s)

Stats

Asked: 4/23/13, 5:42 PM
Seen: 2847 times
Last updated: 3/16/15, 8:10 AM