Ваша проблема заключается в понимании аргументов, переданных в поля 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')
Когда ваш код не соответствует этому, между двумя полями не устанавливается ссылка, и вы будете иметь для каждой независимой от модели значения.
Вы имеете в виду "partner module"? На экране нет модуля клиента. – saulspatz
Да, я имею в виду форму клиента, которая использует партнерский модуль – ruud