This question has been flagged
3 Replies
6243 Views

Hello, 

   Is there a way you can have a fake many2one field on a model without storing it on the database?  I know the related field will do this, but the problem with that is it also changes the related record's value once I make a change to the related field and I dont want to do that.

For example, lets say I have a related field named 'company_rel' which is linked to a partner_id (many2one) field that points to the company_id field like this:

     'company_rel': fields.related('partner_id', 'company_id', relation='res.company', type='many2one', string='company')

If I add the company_rel field to the form view, and change the value, then it also changes the value for the related partner as well, which is what I dont want to do. 

I also tried using the dummy field type, which almost works, but when I make a selection from the drop down list, it returns a False value when I try to use the selected id in another method.

I also tried making a regular many2one field where I set the store=False attribute, but that didnt work either 

Is there a way to make a fake many2one field so that I can use the selected id in another method without storing it to the field to the database?

Avatar
Discard

How are you trying to use the selected value of the many2one?. Dummy should work, please expose the use that you need to do with the fake field many2one

Author Best Answer


Avatar
Discard

That solution is not thread safe because multiple users using the same form will be replacing the value of the _new_dummy_id_variable property of the class. How you need to call another_method method? beause dummy fields will lost it's value only when you save the form because of the set void method. Used in on_changes or to filter others fields it will work until you save and load the form again

If you don't describe properly what you need, we are blind to give you a solution

Author

That is true. I didn't think about other users possibly changing the property at the same time. What I am trying to do is check what the partners pricelist is set to before creating a new sales order. If the partner has a 'Manual' pricelist selected for them, then a dialog opens up prompting the user to select another valid pricelist for the order so that the right pricing is calculated for the products. Otherwise it creates the order with the other valid pricelists. The point of the dummy field is to list the other pricelists for the user to choose from without actually changing it on the partner record. So when the dialog opens, it displays the dummy pricelist field for the user to select, then creates the order with the new pricelist id. Im just not sure how to do this in odoo without adding a many2one field on the database. Thank you for your help

Best Answer

Try to use computed field, with combination of all tree: compute='_my_compute_func', inverse='_my_inverse_func' and store=False, in this case it will be "fake" field as you refer to it and will not be saved to database. you can use selected id inside of _my_inverse_func, OR in addition of this combination, you can have onchange function on this field as well... in the later case, if your application logic is applied under onchange function, then inverse function should present anyway, but it can be simple placeholder (just to allow editing of field in UI) as:

@api.multi
def _my_inverse_func(self):
    pass

...
NOTE: that onchange way will work only if you'll use selected id immediately, while user edits the UI. if you're planing to access this field later from the code, then you should stick with the first option and properly implement both, compute and inverse functions, i.e. _my_compute_func must compute value of this field (the id) and assign it to the field. then it'll not return "false" as in your case.

Avatar
Discard