18
votes

What I've done:

I have a module with

myfield = fields.Many2one('res.partner', string="Graduate", domain=[('is_graduated', '=', True)])

Then I have another class with

_inherit = 'res.partner'
is_graduated = fields.Boolean("Graduated before?", default=False)
graduations = fields.Many2many('my_module.courses', string="Graduation courses")

What I get:

The myfield works good, but the graduations field is empty. If you edit user 1 profile you can add entries to graduation field using Add item, but I need it to be filled automaticaly.

What I expect:

I expect that every record where myfield is set to lets say user 1, will be visible in field graduations when you open user 1 profile. When I create record and set myfield value to lets say user 1, that record must to be visible in user 1 profile in the field graduations. How to achieve that?

4
And where does the is_graduated field come into play? You don't mention it in the "What I expect" section. Also, what the my_module.courses model is supposed to represent? It's hard for me to understand what you are trying to achieve...Ludwik Trammer

4 Answers

39
votes

user_rel_ids = fields.Many2many(comodel_name='course', relation='user_course_rel', column1='user_id', column2='course_id')

Or

user_rel_id = fields.Many2many('course') 

For Filling Data (for add new relation)

user_rel_id = [(4,course_id)]

According to http://odoo4u.blogspot.com/2014/10/orm-methods.html, It says: A full list of options is in the documentation for the class. This same thing will apply for one2many

For a many2many and one2many field, a list of tuples is expected. Here is the list of the tuple that is accepted, with the corresponding semantics:

(0, 0, { values }) link to a new record that needs to be created with the given values dictionary

(1, ID, { values }) update the linked record with id = ID (write values on it)

(2, ID) remove and delete the linked record with id = ID (calls unlink on ID, that will delete the object completely, and the link to it as well)

(3, ID) cut the link to the linked record with id = ID (delete the relationship between the two objects but does not delete the target object itself)

(4, ID) link to existing record with id = ID (adds a relationship)

(5) unlink all (like using (3, ID) for all linked records)

(6, 0, [IDs]) replace the list of linked IDs (like using (5) then (4,ID) for each ID in the list of IDs)

1
votes

You need to use an onchange method for myfield, then inside it you need to fill the graduations field, something like this:

@api.onchange('myfield'):
def _onchange_myfield(self):
    #fill graduations field here...
    ...
1
votes
_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") 
0
votes

You can achieve like these.

For example:

@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') 

If you don't want to use @api.depends than you may use @api.multi. For reference you may check out account module with account_invoice.py file.