Почему метод browse возвращает неправильный набор записей, используя несуществующий идентификатор? - PullRequest
0 голосов
/ 26 декабря 2018

Когда я использую метод search и создаю набор записей, ищущий несуществующий идентификатор, результатом является пустой набор записей, как и ожидалось:

>>> self.env['account.invoice'].search([('id', 'in', [23232323123123123, ])])
account.invoice()

Но если я делаю то же самое с browse метод, результатом является набор записей с этим идентификатором, но на самом деле запись не существует:

>>> o = self.env['account.invoice'].browse([23232323123123123])
>>> o
account.invoice(23232323123123123,)
>>> o.id
23232323123123123
>>> o.number
Traceback (most recent call last):
File "/path/to/odoo/odoo/fields.py", line 937, in __get__
    value = record.env.cache.get(record, self)
File "/path/to/odoo/odoo/api.py", line 960, in get
    value = self._data[field][record.id][key]
KeyError: (<odoo.sql_db.Cursor object at 0x7f4d2985e9e8>, 1)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.5/code.py", line 91, in runcode
    exec(code, self.locals)
File "<console>", line 1, in <module>
File "/path/to/odoo/odoo/fields.py", line 937, in __get__
    value = record.env.cache.get(record, self)
File "/path/to/odoo/odoo/api.py", line 961, in get
    return value.get() if isinstance(value, SpecialValue) else value
File "/path/to/odoo/odoo/api.py", line 993, in getter
    raise exception
File "/usr/lib/python3.5/code.py", line 91, in runcode
    exec(code, self.locals)
File "<console>", line 1, in <module>
File "/path/to/odoo/odoo/fields.py", line 937, in __get__
    value = record.env.cache.get(record, self)
File "/path/to/odoo/odoo/api.py", line 961, in get
    return value.get() if isinstance(value, SpecialValue) else value
File "/path/to/odoo/odoo/api.py", line 993, in getter
    raise exception
File "/usr/lib/python3.5/code.py", line 91, in runcode
    exec(code, self.locals)
File "<console>", line 1, in <module>
File "/opt/odoo/odoo_11/src/linked/l10n_es_account_invoice_sequence/models/account_invoice.py", line 64, in unlink
    self.filtered(lambda x: x.journal_id.invoice_sequence_id).write(
File "/path/to/odoo/odoo/models.py", line 4540, in filtered
    return self.browse([rec.id for rec in self if func(rec)])
File "/path/to/odoo/odoo/models.py", line 4540, in <listcomp>
    return self.browse([rec.id for rec in self if func(rec)])
File "/opt/odoo/odoo_11/src/linked/l10n_es_account_invoice_sequence/models/account_invoice.py", line 64, in <lambda>
    self.filtered(lambda x: x.journal_id.invoice_sequence_id).write(
File "/path/to/odoo/odoo/fields.py", line 944, in __get__
    value = record.env.cache.get(record, self)
File "/path/to/odoo/odoo/api.py", line 961, in get
    return value.get() if isinstance(value, SpecialValue) else value
File "/path/to/odoo/odoo/api.py", line 993, in getter
    raise exception
File "/path/to/odoo/odoo/models.py", line 2601, in read
    values[name] = field.convert_to_read(record[name], record, use_name_get)
File "/path/to/odoo/odoo/models.py", line 4758, in __getitem__
    return self._fields[key].__get__(self, type(self))
File "/path/to/odoo/odoo/fields.py", line 937, in __get__
    value = record.env.cache.get(record, self)
File "/path/to/odoo/odoo/api.py", line 961, in get
    return value.get() if isinstance(value, SpecialValue) else value
File "/path/to/odoo/odoo/api.py", line 993, in getter
    raise exception
odoo.exceptions.MissingError: ('Record does not exist or has been deleted.', None)

Это объяснение в документации :

Принимает идентификатор базы данных или список идентификаторов и возвращает набор записей, что полезно при получении идентификаторов записей из-за пределов Odoo (например, при передаче данных через внешнюю систему) или при вызове методов в старом API

  • Это нормальное поведение?Я считаю этот метод бесполезным
  • Должен ли я заранее проверить, существуют ли все записи, используемые в browse, в базе данных?

1 Ответ

0 голосов
/ 26 декабря 2018

Да, это нормальное поведение.Проверьте метод Броу.Эта строка комментируется

assert all(isinstance(id, IdType) for id in ids), "Browsing invalid ids: %s" % ids

Но у вас есть метод существует

exist () Возвращает новый набор записей, содержащий только записи, которые существуют в базе данных.Может использоваться для проверки того, существует ли запись (например, полученная извне):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...