如何在另一个模块中复制模块的值[ODOO]

时间:2015-10-22 12:34:22

标签: python module copy odoo

我制作了自定义订阅模块

subscription.py

from openerp.osv import fields, osv

class subscriptions(osv.osv):
    _name = "subscriptions.sub"
    _description = "subscriptions"

    _columns = {
        'sub_id': fields.integer('Subscription ID', size=10),
        'cust_id': fields.many2one('res.partner','customer_id', 'Customer ID')
     }

partner.py

from openerp import fields, models

class Partner(models.Model):
    _inherit = 'res.partner'

    customer_id = fields.Integer('Customer ID'),
    subscription_id =  fields.One2many('subscriptions.sub', 'sub_id', 'Subscription ID')

当我从客户模块创建订阅时,它也会显示在订阅模块中,但是当我在订阅模块中创建订阅时,它不会显示在客户模块中。

我可以在正确的方向上获得一些帮助吗?

1 个答案:

答案 0 :(得分:0)

您的问题是了解传递给Many2one和One2many字段的参数。

For Many2one

documentation中,目前陈述如下:

  

<强> class openerp.fields.Many2one(comodel_name=None, string=None, **kwargs)

     

此类字段的值是大小为0(无记录)或1(单个记录)的记录集。

     

<强>参数

     
      
  • comodel_name - 目标模型的名称(字符串)
  •   
  • auto_join - 是否在搜索该字段时生成JOIN(布尔值,默认为False
  •   
     

除相关字段或字段扩展名外,属性comodel_name是强制性的。

因此,fields.Many2one的第二个参数是该字段在界面中的名称。在旧的API中,我们可以看到(in openerp/osv/fields.py)第三个参数是auto_join标志:

class many2one(_column):              
    # ...
    def __init__(self, obj, string='unknown', auto_join=False, **args):

因此,在给定的示例中,您应该删除第二个参数,并在指定many2one时只有两个参数。

For One2many

对于One2many,文档说明:

  

<强> class openerp.fields.One2many(comodel_name=None, inverse_name=None, string=None, **kwargs)

     

One2many场;这样一个字段的值是comodel_name中所有记录的记录集,使得字段inverse_name等于当前记录。

     

<强>参数

     
      
  • comodel_name - 目标模型的名称(字符串)
  •   
  • inverse_name - Many2one中反向comodel_name字段的名称(字符串)
  •   
     

属性comodel_nameinverse_name是强制性的,但相关字段或字段扩展名除外。

所以在这种情况下你是对的,需要第二个参数,但你选择的那个(sub_id)是错误的。对于inverse_name,您必须在Many2one上选择comodel_name字段,该字段将使用One2many指回模型。因此,在您的实例中,inverse_name应为cust_id

结论

要建立从模型的Many2one字段到另一个模型的One2many字段的关系,inverse_name字段的One2many必须是技术名称那个Many2One字段,例如:

class ModelA(models.Model):
    _name = 'model.a'
    m2o_model_a = fields.Many2one('model.a')

class ModelB(models.Model):
    _name = 'model.b'
    # inverse_name is set to the Many2one of ModelA which points to ModelB
    o2m_model_a = fields.One2many('model.b', 'm2o_model_a')

如果您的代码不遵循此规则,则不会在这两个字段之间建立链接,并且您将为每个模型字段提供独立的值。