This question has been flagged
4 Replies
30641 Views

hi all ,

i am trying to add a new fields (many to many fields to product.product

'myField' : fields.many2many('myclass.myclass', string='MY FIELD', selection=_sel_func_field),

and my field is a selection from other table.

but when i try to add new product .

this message appear

Client Traceback (most recent call last): File "/usr/lib/pymodules/python2.7/openerp/addons/web/http.py", line 204, in dispatch response["result"] = method(self, *self.params) File "/usr/lib/pymodules/python2.7/openerp/addons/web/controllers/main.py", line 1129, in call_kw return self._call_kw(req, model, method, args, kwargs) File "/usr/lib/pymodules/python2.7/openerp/addons/web/controllers/main.py", line 1121, in _call_kw return getattr(req.session.model(model), method)(args, *kwargs) File "/usr/lib/pymodules/python2.7/openerp/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 "/usr/lib/pymodules/python2.7/openerp/addons/web/session.py", line 31, in proxy_method result = self.session.send(self.service_name, method, args) File "/usr/lib/pymodules/python2.7/openerp/addons/web/session.py", line 104, in send raise xmlrpclib.Fault(openerp.tools.ustr(e), formatted_info) Server Traceback (most recent call last): File "/usr/lib/pymodules/python2.7/openerp/addons/web/session.py", line 90, in send return openerp.netsvc.dispatch_rpc(service_name, method, args) File "/usr/lib/pymodules/python2.7/openerp/netsvc.py", line 293, in dispatch_rpc result = ExportService.getService(service_name).dispatch(method, params) File "/usr/lib/pymodules/python2.7/openerp/service/web_services.py", line 626, in dispatch res = fn(db, uid, *params) File "/usr/lib/pymodules/python2.7/openerp/osv/osv.py", line 188, in execute_kw return self.execute(db, uid, obj, method, *args, *kw or {}) File "/usr/lib/pymodules/python2.7/openerp/osv/osv.py", line 131, in wrapper return f(self, dbname, args, *kwargs) File "/usr/lib/pymodules/python2.7/openerp/osv/osv.py", line 197, in execute res = self.execute_cr(cr, uid, obj, method, args, *kw) File "/usr/lib/pymodules/python2.7/openerp/osv/osv.py", line 185, in execute_cr return getattr(object, method)(cr, uid, args, *kw) File "/usr/lib/pymodules/python2.7/openerp/addons/mail/mail_thread.py", line 242, in create thread_id = super(mail_thread, self).create(cr, uid, values, context=context) File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 4429, in create self._check_selection_field_value(cr, user, field, vals[field], context=context) File "/usr/lib/pymodules/python2.7/openerp/osv/orm.py", line 2815, in _check_selection_field_value elif val in dict(self._columns[field].selection(self, cr, uid, context=context)): TypeError: unhashable type: 'list'*

Avatar
Discard
Best Answer

Hello Samir,

Your are adding many2many field in a wrong way.

The syntax to add a many2many field is as following:

'Field_name': fields.many2many('Object', 'rel_table','Field1','Field2','String')

Here,

  • obj: _name of destination object. Bidirectional multiple relationship between objects.(required)
  • rel: relationship table to map the two fields together.(required)
  • field1: name of field in rel table storing the id of the current object (required)
  • field2: name of field in rel table storing the id of the target object (required)
  • String: field label

For Example,

'standard_ids':fields.many2many('school.standard','subject_standards_rel','standard_id','subject_id','Standards')

Now, In version 7.0 onward you can add the many2many field without 'rel_table' and 'fields'.

Syntax:

 'Field_name':fields.many2many('Object','String')

For Example:

'standard_ids':fields.many2many('school.standard','Standards'),

If you want use selection than your "_sel_func_field" must return list.

Hope now you will get whole concept of many2many field.

Thanks.

Avatar
Discard
Author

thanks , i had solved this . thanks a lot

Best Answer

Hi,

Please post your code so we can help you.

see syntaxe many2many :

fields.many2many doc V7.

Avatar
Discard
Best Answer

It looks like you're confusing some of the syntax for creating a many2many field. You need at least 5 arguments:

  • The other object to link to
  • The name of your new intermediary table to map the two together
  • The name of the current object's id column (in the database itself)
  • The name of the target object's id column (in the database itself)
  • The name of the field

A selection field is completely different and just allows picking from a predefined list of options.

Refer to doc.openerp.com/trunk for more explanation.

Avatar
Discard
Author Best Answer

thanks for your replay ,

import logging import string import datetime import re

from osv import osv, fields from tools.misc import ustr from tools.translate import _

class mymodule_product_field(osv.osv): _name = 'mymodule.product.field' _order = 'name' _columns = { 'product_id' : fields.many2many('product.product', id1='field_id' ,id2='product_id'), 'id': fields.char('id', size=16 ), 'name': fields.char('Name', size=16 ),

}

mymodule_product_field()

def _sel_func_field(self, cr, uid, context=None): obj = self.pool.get('mymodule.product.field') ids = obj.search(cr, uid, []) res = obj.read(cr, uid, ids, ['name', 'id'], context) res = [(r['id'], r['name']) for r in res] return res

class product_product(osv.osv): _inherit = 'product.product' _name = 'product.product'

_columns = {
    'myfield' : fields.many2many('mymodule.product.field', id1='product_id', id2='field_id' , string='MY FIELD', selection=_sel_func_field),
}

product_product()

Avatar
Discard