Заполнение Many2many поля (odoo 8)
Что я сделал:
У меня есть модуль с
myfield = fields.Many2one('res.partner', string="Graduate", domain=[('is_graduated', '=', True)])
Тогда у меня есть еще один класс с
_inherit = 'res.partner'
is_graduated = fields.Boolean("Graduated before?", default=False)
graduations = fields.Many2many('my_module.courses', string="Graduation courses")
Что я получаю:
myfield
работает хорошо, но поле graduations
пуст. Если вы редактируете профиль user 1
, вы можете добавить записи в поле graduation
, используя Add item
, но мне нужно, чтобы он был заполнен автоматически.
Что я ожидаю:
Я ожидаю, что каждая запись, где myfield
установлена, чтобы сказать user 1
, будет видна в поле graduations
при открытии профиля user 1
. Когда я создаю запись и устанавливаю значение myfield
, чтобы сказать user 1
, эта запись должна быть видимой в профиле user 1
в поле graduations
. Как достичь этого?
Ответы
Ответ 1
user_rel_ids = fields.Many2many (comodel_name = 'курс', отношение = 'user_course_rel', column1 = 'user_id', column2 = 'course_id')
Или же
user_rel_id = fields.Many2many('course')
Для заполнения данных (для добавления нового отношения)
user_rel_id = [(4,course_id)]
Согласно http://odoo4u.blogspot.com/2014/10/orm-methods.html, в нем говорится: Полный список опций приведен в документации к классу. То же самое относится к one2many
Для поля many2many и one2many ожидается список кортежей. Вот список принятых кортежей с соответствующей семантикой:
(0, 0, { values })
ссылка на новую запись, которую необходимо создать с данным словарем значений
(1, ID, { values })
обновить связанную запись с id = ID (записать в нее значения)
(2, ID)
удалить и удалить связанную запись с id = ID (вызывает unlink для ID, который полностью удалит объект, а также ссылку на него)
(3, ID)
обрезать ссылку на связанную запись с id = ID (удалить связь между двумя объектами, но не удаляет сам целевой объект)
(4, ID)
ссылка на существующую запись с id = ID (добавляет связь)
(5)
отсоединить все (например, используя (3, ID) для всех связанных записей)
(6, 0, [IDs])
заменить список связанных идентификаторов (например, используя (5) затем (4, ID) для каждого идентификатора в списке идентификаторов)
Ответ 2
Вам нужно использовать onchange method
для myfield
, а затем внутри него вам нужно заполнить поле graduations
, что-то вроде этого:
@api.onchange('myfield'):
def _onchange_myfield(self):
#fill graduations field here...
...
Ответ 3
_inherit = 'crm.phonecall'
alarm_ids = fields.Many2many('calendar.alarm',string="Reminders")
set the alarm_ids of calendar.event model in create method of crm phonecall...
alarm_ids = [(6,0,self.alarm_ids.ids)]
_inherit = 'calendar.event'
alarm_ids = fields.Many2many('calendar.alarm',string="Reminders")
Ответ 4
Вы можете достичь таких целей.
Например:
@api.one
@api.depends(
#here you may define your depend field name
)
def _set_graduations(self):
#here comes your logic which will collect ids
#and than return it with self.field_name like
self.graduations = [list_of_ids]
graduations = fields.Many2many('my_module.courses', string='Payments',
compute='_set_graduations')
Если вы не хотите использовать @api.depends, вы можете использовать @api.multi. Для справки вы можете проверить модуль учетной записи с файлом account_invoice.py.