Как ввести значение поля Many2one в базу данных Odoo через XML-файл?
Я работаю с Odoo 8 и пытаюсь ввести данные в базу данных через XML-файл.
Содержимое этого файла следующее:
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<record id="event_invitation_email_template" model="email.template">
<field name="name">Event Invitation</field>
<field name="subject">Invitation to an event</field>
<field name="email_from">${(object.event_id.user_id.email or 'noreply@localhost')|safe}</field>
<field name="email_to">${object.email|safe}</field>
</record>
</data>
</openerp>
Это прекрасно работает. Но я хочу добавить еще одно поле, model_id
, которое является Many2one
(указывая на ir.model
). Я бы знал, как это сделать, если бы значение, которое я хочу установить, имело XML ID, но это не так.
Я хочу установить модель my.новый.модель Как model_id
, но я не знаю ее идентификатор в базе данных, если я не делаю поиск.
1 ответ:
Предыстория:
При загрузке данных путем установки ресурсов (модели, поля, модели-записи, представления, правила записи, действия, пункты меню и т. д.), Odoo регистрирует записи сопоставления для всех ресурсов в таблице' ir_model_data ' ('ir.модель.объект data'), так что мы можем ссылаться на эти записи позже, даже из других модулей.
Записи сопоставления в 'ir_model_data' имеют следующие замечательные столбцы:
- модуль: имя модуля, строковый литерал (не его id)
- Модель : полное имя объекта, разделенное точками (также известное как техническое имя объекта)
- res_id: идентификатор ресурса / идентификатор базы данных (PK записи в таблице, в которой хранится ресурс)
- name: имя записи, строковый литерал, который в сочетании с именем модуля однозначно идентифицирует запись / ресурс
Имя записи в сочетании с именем модуля образуют то, что мы знаем как внешний ресурс. ID, который имеет следующий полный вид: ' module_name.resource_name ' .
Записи, определенные в XML-данных, определяют свои внешние идентификаторы с помощью атрибута id тега record.Атрибут 'id' может явно включать ' module_name."(полностью квалифицированная форма) или нет. В последнем случае (относительная форма) модуль, объявляющий ресурс, является предполагается:
Вышеприведенная длинная история должна была иметь достаточный фон для последующего ответа.Ответ:
При обработке дочерних тегов' field 'любого тега' record 'атрибут' ref ' должен иметь внешний идентификатор существующей записи, на которую ссылается ссылка (полный или относительный форма):
- https://github.com/odoo/odoo/blob/8.0/openerp/tools/convert.py#L727
- https://github.com/odoo/odoo/blob/8.0/openerp/tools/convert.py#L836
Отображение записывает, что эталонные модели создаются при инициализации модулей / моделей / полей. Поскольку они не имеют соответствующей записи XML и не могут объявить свой соответствующий внешний идентификатор с помощью этого средства, ORM создает свой внешний идентификатор на основе префикса 'model_' и технических характеристик объекта имя (точки заменены подчеркиванием):
Именно поэтому записывает, что эталонные модели ('ir.записи model') имеют следующий вид: model_XXXXX
Записи для некоторых других ресурсов также имеют известные префиксы для их внешних идентификаторов:
Модули: https://github.com/odoo/odoo/blob/8.0/openerp/modules/db.py#L90
Модели: https://github.com/odoo/odoo/blob/8.0/openerp/models.py#L382
Поля: https://github.com/odoo/odoo/blob/8.0/openerp/models.py#L444
SELECT * FROM "ir_model_data" WHERE name LIKE 'module_%'; -- most are 'ir.module.module' records SELECT * FROM "ir_model_data" WHERE name LIKE 'model_%' ORDER by module, name; -- all/most are 'ir.model' records SELECT * FROM "ir_model_data" WHERE name LIKE 'field_%' ORDER BY module, name; -- all/most are 'ir.model.fields' records
Записи для других ресурсов могут следовать какому-либо соглашению или просто не следовать:
SELECT * FROM "ir_model_data" WHERE name LIKE 'view_%' ORDER by module, name; -- all/most are 'ir.ui.view' records SELECT * FROM "ir_model_data" WHERE model LIKE 'ir.ui.view' AND name NOT LIKE 'view_%' ORDER by module, name; -- 'ir.ui.view' records with unconventional names
Итак, в вашем случае строка, которую вы ищете, выглядит так:
<field name="model_id" eval="ref('your_module.model_my_new_model')"/>