简体   繁体   English

为 model (Odoo 14) 创建 _name_search 方法时出现 Odoo 错误

[英]Odoo error when creating a _name_search method for a model (Odoo 14)

In my Odoo app, I have an Area model and a Department model.在我的 Odoo 应用程序中,我有一个区域 model 和一个部门 model。 Every area has a department (Many2One relation).每个区域都有一个部门(Many2One 关系)。 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.我想覆盖部门中的"_name_search" function,以便可以使用代码和名称进行搜索。 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但是,当我在“区域”表单视图中并开始在department_id字段中输入以选择该区域的部门时,Odoo 显示错误

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:我正在使用 Odoo 14。这是我的代码:

    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.

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.在版本 12 中, name_search方法原样返回_name_search (对列表)的结果,但在版本 14 中,它将_name_search的结果传递给浏览方法,这就是 Odoo 引发异常的地方。

To fix the error, you can either return records.ids() or the result of the _search (Query object) method like in many examples when they override the _name_search method要修复错误,您可以返回 records.ids ()_search (查询对象)方法的结果,就像在许多示例中覆盖_name_search方法时一样

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM