2015-10-22 5 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

Вы имеете в виду "partner module"? На экране нет модуля клиента. – 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 - имя поля обратного 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') 

Когда ваш код не соответствует этому, между двумя полями не устанавливается ссылка, и вы будете иметь для каждой независимой от модели значения.

+0

Тщательный ответ. Я слегка смягчил форматирование. Также для вашей справки, если на вопрос есть языковой тег, этот вопрос и его ответы автоматически выделяют синтаксис для этого языка. (Так что в этом случае вы получите подсветку python бесплатно. :)) – theB

+0

Спасибо! Это именно то, что мне нужно. Теперь работает – ruud

 Смежные вопросы

  • Нет связанных вопросов^_^