odoo 通过 xmlid 扩展现有数据文件

odoo extend existing data file by xmlid

里面有记录 openerp/addons/base/res/res_country_data.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data noupdate="1">
        <record id="ae" model="res.country">
            <field name="name">United Arab Emirates</field>
            <field name="code">ae</field>
            <field file="base/static/img/country_flags/ae.png" name="image" type="base64" />
            <field name="currency_id" ref="AED" />
            <field eval="971" name="phone_code" />
        </record>

我想扩展此数据以包括对我的模型数据的引用,因此我尝试了以下操作:

<openerp>
    <data>
        <!-- extend data from country_data.xml -->
        <record id="ae_range" model="res.country"> 
            <field name="ean_range" ref="res.country.ean_range">629</field>
        </record>

        <!-- data for my model country model must be pointing to -->
        <record id="629" model="res.country.ean_range"> 
            <field name="range_start">629</field>
            <field name="range_end">629</field>
            <field name="name">629</field>
        </record>

按照this question中的建议,尝试了常见的继承规则,例如:

    <record id="ae_range" model="res.country"> 
        <field name="inherit_id" ref="res.country.ean_range"/>
        ...
    </record>

但每次我都收到关于缺少 xmlid 的错误。如何扩展现有的数据文件并用我自己的数据填充模块?也许我做错了什么,也许你可以建议如何使用在模块安装期间添加的我的字段数据填充国家/地区模型?

编辑: Class 定义

class InstantProductTemplate(models.Model):
    _name = 'product.template'
    _inherit = 'product.template'

    country_of_origin = fields.Many2one('res.country',
                                        string='Country of origin',
                                        default="_guess_country",
                                        store=True)
class InstantCountryRanges(models.Model):
    _name = 'res.country'
    _inherit = 'res.country'

    ean_range = fields.One2many('res.country.ean_range', 'name')


class InstantCountry(models.Model):
    _name = 'res.country.ean_range'

    name = fields.Char()
    range_start = fields.Integer("Range start")
    range_end = fields.Integer("Range end")

提前致谢!

我建议为您的范围使用更好的 xml ID,然后尝试在您的 xml 文件中获得正确的顺序,例如:

<openerp>
    <data>
        <!-- use <module>.<xmlid> as correct xml id for referencing -->
        <record id="ean_range_629" model="res.country.ean_range">
            <field name="range_start">629</field>
            <field name="range_end">629</field>
            <field name="name">629</field>
            <field name="country_id" ref="base.ae" />
        </record>
    </data
</openerp>

您需要设置正确的 xml ID 才能覆盖。对于外部模块记录,您必须设置模块名称,然后设置 xml id。例如,您可以在 Web 客户端中使用调试模式找到正确的 xml ID。打开记录(此处为阿拉伯联合酋长国 res.country)并在调试下拉菜单中选择 "View Metadata".

编辑 清除one2many关系后:

您将需要 res.country.ean_range 上的 many2one 字段,并且应该在 res.country 上编辑您的 one2many:

# res.country.ean_range
country_id = fields.Many2one(comodel_name='res.country', string="Country")

# res.country
ean_range = fields.One2many('res.country.ean_range', 'country_id')

现在您可以像上面那样使用xml了! (也经过编辑)