Reputation: 820
In my Odoo app, I have an Area model and a Department model. Every area has a department (Many2One relation). Every department has a code and name. I wanted to overwrite the "_name_search"
function in the department so it can be searched using both code and name. But when I am on the Area form view and I start typing in the department_id
field for selecting a department on that area, Odoo shows an error
psycopg2.ProgrammingError: operator does not exist: integer = record
LINE 1: ...OM "cusaf_department" WHERE "cusaf_department".id IN ((1, 'A...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
I am working with Odoo 14. Here is my code:
class Department(models.Model):
_name = 'cusaf.department'
_description = 'Departamento'
name = fields.Char(string='Departamento', required=True)
department_code = fields.Char(string='Código departamento')
_sql_constraints = [
('name_uniq', 'unique (name)',
"Error: Ya existe un departamento con el mismo nombre"),
('name_uniq', 'unique (department_code)',
"Error: Ya existe un departamento con el mismo código")
]
@api.model
def _name_search(self, name='', args=None, operator='ilike', limit=100):
if args is None:
args = []
domain = args + ['|', ('department_code', operator, name), ('name', operator, name)]
return super(Department, self).search(domain, limit=limit).name_get()
class Area(models.Model):
_name = 'cusaf.area'
_description = 'Area'
_inherit = ['mail.thread', 'mail.activity.mixin']
active = fields.Boolean(default=True)
name = fields.Char(string='Identificador externo', required=True)
department_id = fields.Many2one('cusaf.department', string='Departamento')
And here is the full error code:
Odoo Server Error
Traceback (most recent call last):
File "/home/ernesto/Programming/odoo/odoo14/odoo/addons/base/models/ir_http.py", line 237, in _dispatch
result = request.dispatch()
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 683, in dispatch
result = self._call_function(**self.params)
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 359, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/home/ernesto/Programming/odoo/odoo14/odoo/service/model.py", line 94, in wrapper
return f(dbname, *args, **kwargs)
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 347, in checked_call
result = self.endpoint(*a, **kw)
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 912, in __call__
return self.method(*args, **kw)
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 531, in response_wrap
response = f(*args, **kw)
File "/home/ernesto/Programming/odoo/odoo14/addons/web/controllers/main.py", line 1377, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/ernesto/Programming/odoo/odoo14/addons/web/controllers/main.py", line 1369, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/ernesto/Programming/odoo/odoo14/odoo/api.py", line 392, in call_kw
result = _call_kw_model(method, model, args, kwargs)
File "/home/ernesto/Programming/odoo/odoo14/odoo/api.py", line 365, in _call_kw_model
result = method(recs, *args, **kwargs)
File "/home/ernesto/Programming/odoo/odoo14/odoo/models.py", line 1792, in name_search
return self.browse(ids).sudo().name_get()
File "/home/ernesto/Programming/odoo/odoo14/odoo/models.py", line 1737, in name_get
result.append((record.id, convert(record[name], record)))
File "/home/ernesto/Programming/odoo/odoo14/odoo/models.py", line 5659, in __getitem__
return self._fields[key].__get__(self, type(self))
File "/home/ernesto/Programming/odoo/odoo14/odoo/fields.py", line 976, in __get__
recs._fetch_field(self)
File "/home/ernesto/Programming/odoo/odoo14/odoo/models.py", line 3067, in _fetch_field
self._read(fnames)
File "/home/ernesto/Programming/odoo/odoo14/odoo/models.py", line 3134, in _read
cr.execute(query_str, params + [sub_ids])
File "<decorator-gen-3>", line 2, in execute
File "/home/ernesto/Programming/odoo/odoo14/odoo/sql_db.py", line 101, in check
return f(self, *args, **kwargs)
File "/home/ernesto/Programming/odoo/odoo14/odoo/sql_db.py", line 298, in execute
res = self._obj.execute(query, params)
Exception
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 639, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/home/ernesto/Programming/odoo/odoo14/odoo/http.py", line 315, in _handle_exception
raise exception.with_traceback(None) from new_cause
psycopg2.ProgrammingError: operator does not exist: integer = record
LINE 1: ...OM "cusaf_department" WHERE "cusaf_department".id IN ((1, 'A...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Upvotes: 2
Views: 744
Reputation: 26738
In version 12 the name_search method returns the result of _name_search
(list of pairs) as it is without modification but in version 14 it passes the result of _name_search
to the browse method and this is where Odoo raises an exception.
To fix the error, you can either return records.ids() or the result of the _search
(Query object) method like in many examples in Odoo when they override the _name_search method
Upvotes: 2