2015-10-22 76 views
0

我做了一个自定义的订阅模块如何复制模块的价值在另一个模块[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') 

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

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

+0

你的意思是“合作伙伴模块”?没有显示客户模块。 – saulspatz

+0

是的,我的意思是使用合作伙伴模块的客户表单 – ruud

回答

0

你的问题是关于理解传递给Many2one和One2many字段的参数。

对于Many2one

documentation,以下是目前提出:

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

这样的字段的值是大小为0(没有记录)或一个记录1(单个记录)。

参数

  • comodel_name - 对象模型的名称(字符串)
  • auto_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时有两个参数。

对于One2many

对于One2many,文档状态:

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

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

参数

  • comodel_name - 目标模型的名称(字符串)
  • inverse_name - 在comodel_name(string)的逆Many2one字段的名称

属性comodel_nameinverse_name是强制性的,除了相关字段或字段扩展的情况。

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

结论

建立从模型的Many2one领域的关系,向另一种模式的One2many领域,One2manyinverse_name必须是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') 

当你的代码没有遵循这个规则时,两个字段之间没有建立链接,并且你将为每个模型字段提供独立的值。

+0

彻底的答案。我淡化了格式。同样供大家参考的是,如果问题上有语言标记,则该问题及其答案会自动为该语言提供语法高亮显示。 (所以在这种情况下,你可以免费获得Python高亮:) :) – theB

+0

谢谢!这正是我需要的。现在正在工作 – ruud

相关问题