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

时间:2016-08-18 08:10:02

标签: openerp odoo-9

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 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")

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我建议您为范围使用更好的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),在调试下拉菜单中选择“查看元数据”。

清除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了! (也编辑过)