Как ввести значение поля 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 &apos;noreply@localhost&apos;)|safe}</field>
            <field name="email_to">${object.email|safe}</field>
        </record>
    </data>
</openerp>

Это прекрасно работает. Но я хочу добавить еще одно поле, model_id, которое является Many2one (указывая на ir.model). Я бы знал, как это сделать, если бы значение, которое я хочу установить, имело XML ID, но это не так.

Я хочу установить модель my.новый.модель Как model_id, но я не знаю ее идентификатор в базе данных, если я не делаю поиск.

Поэтому я понятия не имею, как управлять своей целью. Кто-нибудь может мне помочь, пожалуйста?
1 2

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 ' должен иметь внешний идентификатор существующей записи, на которую ссылается ссылка (полный или относительный форма):

Отображение записывает, что эталонные модели создаются при инициализации модулей / моделей / полей. Поскольку они не имеют соответствующей записи 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')"/>