'set default value for a many2one field

when the user set nom_rubrique that come the value of many2one filled will be set by default

 class A(models.Model):

    rubrique_id = fields.Many2one('risques.rubrique',
        string='Rubrique',
        default=_default_rubrique,
        index=True,
        track_visibility='onchange',
        change_default=True)

class B(models.Model):
    critere_ids = fields.One2many('risques.critere','rubrique_id',required=True, string="Critére d'évaluation")


Solution 1:[1]

It seems syntax error in your code, try below solution:

Also parent_id field does not exits in your reference risques.rubrique model

class critere(models.Model):
    _name = 'risques.critere'
    _rec_name = 'nom_critere'

    def _default_rubrique(self):
        #here you did mistake , your search method syntex was wrong
        #also it is better to use limit instead of [0] it may raise 
        #error if your search will return empty list
        return self.env['risques.rubrique'].search([('parent_id', '=', False)], limit=1).id

    nom_critere = fields.Char(string="Nom du Critere")
    rubrique_id = fields.Many2one('risques.rubrique',
                                  string='Rubrique',
                                  default=_default_rubrique,
                                  index=True,
                                  track_visibility='onchange',
                                  change_default=True)

class rubrique(models.Model):
    _name = 'risques.rubrique'
    _rec_name = 'nom_rubrique'
    nom_rubrique = fields.Char(string="Rubrique")
    critere_ids = fields.One2many('risques.critere', 'rubrique_id', required=True, string="Critére d'évaluation")

Solution 2:[2]

use lambda for set default value:

type = fields.Many2one('your.model',"String to display", default=lambda self: self.env['your.model'].search([('name','=','value you need to set as default')]))

Its simple.

Solution 3:[3]

The answer from Ridma Gimhani is almost correct. Since I can't edit his answer, I will edit his answer here

type = fields.Many2one('your.model',"String to display", 
                        default=lambda self: 
                        self.env['your.model']
                       .search([], limit=1))

We don't need to provide some search expression and the important thing we need to limit the result, if not, we will get an error

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 marc_s
Solution 2 Ridma Gimhani
Solution 3 NM Naufaldo