我制作了自定义订阅模块
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 :(得分:0)
您的问题是了解传递给Many2one和One2many字段的参数。
在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时只有两个参数。
对于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_name
和inverse_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')
如果您的代码不遵循此规则,则不会在这两个字段之间建立链接,并且您将为每个模型字段提供独立的值。