После глубокого поиска я смог найти источник проблемы, когда мы поместили букву в поля партнера, она автоматически вызовет функцию name_search в базовом модуле, осуществляя поиск в таблице res_partner, используя SQL запрос:
select id
from res_partner
where 'entered value' [ '=' or 'like' or 'ilike' or '=like' or
'=ilike'] [email, or name, ref ]...`;
Этот запрос возвращает список кортежей
[(id1, 'partner name1'), (id2, 'partner name2')]
, а функция возвращает второго вяза от каждой кортежи ведьмы - имя партнера, но если у вас есть некоторые Поле партнера с именем пусто, будет отображаться ошибка, и это объясняет, почему некоторые буквы не генерируют сообщение об ошибке. Некоторые буквы не генерируют сообщение об ошибке, потому что запрос SQL выполняет поиск по нескольким полям, таким как Email, ссылка, имя партнера.
И существование этой функции только у партнера, а не у каждой таблицы объясняет, что основная цель функции - позволить нам выполнять поиск по другим полям [электронная почта, ссылка ...]
Путь к функции: /addons/base/res/res_partner.py
строка 640
@api.model
def name_search(self, name, args=None, operator='ilike', limit=100):
if args is None:
args = []
if name and operator in ('=', 'ilike', '=ilike', 'like', '=like'):
self.check_access_rights('read')
where_query = self._where_calc(args)
self._apply_ir_rules(where_query, 'read')
from_clause, where_clause, where_clause_params = where_query.get_sql()
where_str = where_clause and (" WHERE %s AND " % where_clause) or ' WHERE '
# search on the name of the contacts and of its company
search_name = name
if operator in ('ilike', 'like'):
search_name = '%%%s%%' % name
if operator in ('=ilike', '=like'):
operator = operator[1:]
unaccent = get_unaccent_wrapper(self.env.cr)
query = """SELECT id
FROM res_partner
{where} ({email} {operator} {percent}
OR {display_name} {operator} {percent}
OR {reference} {operator} {percent})
-- don't panic, trust postgres bitmap
ORDER BY {display_name} {operator} {percent} desc,
{display_name}
""".format(where=where_str,
operator=operator,
email=unaccent('email'),
display_name=unaccent('display_name'),
reference=unaccent('ref'),
percent=unaccent('%s'))
where_clause_params += [search_name]*4
if limit:
query += ' limit %s'
where_clause_params.append(limit)
self.env.cr.execute(query, where_clause_params)
partner_ids = map(lambda x: x[0], self.env.cr.fetchall())
if partner_ids:
return self.browse(partner_ids).name_get()
else:
return []
return super(Partner, self).name_search(name, args, operator=operator, limit=limit)
строка ошибки:
if partner_ids:
return self.browse(partner_ids).name_get()
else:
return []