Skip to main content

Odoo/OpenERP : _rec_name and name_get()

_rec_name = ‘name’ (by default) 

where ‘name’ is field of the model. If ‘name’ field is not there then you have to assign any other filed name to this ‘_rec_name’ variable from columns.

Note : If ‘name’ field is there in your columns then there is no need to specify '_rec_name'.

Let’s try to dig more using an example.


Case I:


If you are having hr.employee module with name field and you are using it as reference in other module, say hr.employee.detail to provide other employee details then you will use it as:

'employee_id' : fields.many2one('hr.employee', 'Employee')

and it will show you the employee name in selection list.

But, In a company, more than one employee can share the same name. So name field can’t be used to differentiate them from each other. But, employee code will be unique for each employee. In such cases, we will take a column field like ‘emp_code’ and will assign it to ‘_rec_name’

_rec_name = ‘emp_code’

So that it can show employee code in dropdown instead of employee name.

Note : In both above cases 'id' will only be store in database. If will affect only the display part.


Case II: 


In same above example if your manager asks you to show combination of both i.e Employee Name, Employee Code what you will do?

In this case we will override name_get() method in hr.employee module

def name_get(self, cr, uid, ids, context={}):
         
        if not len(ids):
            return []

        res=[]

        for emp in self.browse(cr, uid, ids,context=context):
   res.append((emp.id, emp.name + ', ' + emp.emp_code))    

        return res

and it will display combination of both in drop-down.


Thanks!!!!!!!!!! Enjoy Programming :)


Comments

  1. Hi overridden the name_get() method and i am showing the combination of emp name and code in the many2one dropdown. now the thing is i want to search the emp with emp code . If i try to search with emp name all names are listing but if i try to search with emp code it is showing create button to create the record. Please give me the solution for this.

    Thanks in advance.

    ReplyDelete
    Replies
    1. For searching, we created a stored computed field called 'display_name'. Then set it as the 'rec_name'.
      Benefit of searching both name and code at once.

      Delete
  2. I think you have to set just

    _rec_name = ‘emp_code’

    as well.

    ReplyDelete
    Replies
    1. Please share me , How to use _rec_name . I don`t understand

      Delete
  3. Hi,
    do you have any idea how to solve this?
    http://stackoverflow.com/questions/31038103/odoo-8-howto-add-product-template-attribute-to-product-product-name-get
    It's a similar occasion...

    ReplyDelete
  4. somewhat same problem as thomas, not able to search (all hierarchy are listed)
    def name_get(self, cr, uid, ids, context=None):
    if not ids:
    return []

    self._rec_name = 'hierarchy'

    res = []
    obj = self.pool.get('soldier2ndlife.product.categories')
    ids = obj.search(cr, uid, [('hierarchy', '!=', '')], context=context)

    for r in self.read(cr, uid, ids, ['id', 'hierarchy'], context):
    res.append((r['id'], r['hierarchy'])) # append the tuple in the list res

    return res

    ReplyDelete
  5. Hi Friends,
    I have another doubt here.I want to know the way to find which field is applied in _rec_name in the particular model.

    I have taken that model id from ir.model table and also I could find all the fields list created in that model through ir.model.fields table.But I could not find which field is used in _rec_name?

    Could you please help me?

    ReplyDelete

Post a comment

Thanks for your valuable comments.

Popular posts from this blog

Odoo: Qweb Templates Cache Issue

Hi Everyone, Today I was working on a hotel booking template in Odoo and changes made in the Qweb template(.xml) were not reflecting on updating module with odoo service restart. Tried few times without any success :(. Finally, I decided to delete the old template from Odoo backend and then update module again and it worked like a charm!! :) Steps to delete template from backend: Settings --> User Interface --> Views --> Search by template name Delete the used template. Although it's a small post, but I'm sure it will meet the purpose and help someone in the future. Thanks!!! Enjoy Programming!! :) Reference Links: =================================== https://www.odoo.com/forum/help-1/question/odoo-cache-and-updating-qweb-templates-84492

Odoo12/13: Add an extra action in the tree view action button

This post will help you to add an action window in Odoo. Odoo13: <act_window id="action_make_bank_payment"              name="Do Bank Payment"              res_model="account.ob.payment"              binding_model="account.move"              view_mode="form"              target="new"              binding_views="list,form"              domain="[('type','=', 'in_invoice')]"              groups="account.group_account_user" /> Odoo12: <act_window id="action_make_bank_payment"              name="Do Bank Payment"              res_model="account.ob.payment"             view_mode="tree,form"              domain="[('type','=', 'in_invoice')]"              groups="account.group_account_user" /> Thanks!!! Enjoy Programming!! :) Reference: https://www.odoo.com/es_

Odoo/OpenERP: one2one relational field example

one2one relational field is deprecated in OpenERP version>5 but you can achieve the same using many2one relational field. You can achieve it in following two ways : 1) using many2one field in both the objects ( http://tutorialopenerp.wordpress.com/2014/04/23/one2one/ ) 2)  using inheritance by deligation You can easily find the first solution with little search over internet so let's start with 2nd solution. Scenario :  I want to create a one2one relation between two objects of openerp hr.employee and hr.employee.medical.details What I should do  i. Add _inherits section in hr_employee class ii. Add field medical_detail_id in hr_employee class class hr_employee(osv.osv):     _name = 'hr.employee'     _inherits = {' hr.employee.medical.details ': "medical_detail_id"}     _inherit = 'hr.employee'         _columns = {              'emp_code':fields.char('Employee Code', si