Help

3

Correct way: Browse vs Search ?

Hi,

I have found in official addons that even though a record has a reference to other records (like one2many), and they already have a browse record with the required information, the programmer still uses the search function to get the list of ids from the database.

Example:

Each hr_employee has a field contract_ids, that is a one2many relationship to hr_contract.

If I already have

   employee_data = employee_obj.browse( blah, blah, blah...)

and I want to access the list of contracts for that employee, what is the right way to get it:

a) Use the list I already have on employee_data.contract_ids and get the information from there,

or

b) Execute a search on contract object looking for contracts related to the employee, like:

   contract_ids = obj_contract.search(cr, uid, [('employee_id','=',emp.id),], context=context)

I would think option a), but I have found that in most cases option b) is used in official addons, so I guess there is a reason for that...

What are cons and pros of each aproach ?

1 Comment
Avatar
Discard
Avatar
Clément THOMAS
-

The advantage of first method is that you have an access directly to browse_records. In the second way you must call a browse() method on obj_contracts with your contract_ids to access to their attributes. But I don't know about performances. You must know that many of addons was written in old versions of OpenERP. Maybe browse method was not so efficiently than know...?

2 Answers
1
Avatar
Serge
Best Answer

if you already have that, and no realy need, replace it by a read

employee_data = employee_obj.browse( cr, uid, ids, context=context)

like

for employee in employee_obj.read( cr, uid, ids, ['contract_ids'], context=context):
    #So in employee['contract_ids'], you have a list of all contract id for this employee
Avatar
Discard
1
Best Answer

option a is right way as option b dose not make any sense. we can say it is mistake of coding in IMO.

--> there is one big plus point of option a: As it will avoids search on object so it will good if you have lots of records in db.

3 Comments
Avatar
Discard
Avatar
Serge
-

option 1 , is a no sense, browse will read ALL field in db, so performance drop, trace the code, if you have 80 fields in the table, openerp will create a select query for 80 fields. Always avoid Browse, browse is for lazy programmer.

what if you have 10-20 lakh records and you fire search query then it will take less time than browse of 80 fields????? in this case search makes no sense.

Avatar
Serge
-

No need a search if you already have the IDS, if you do a browse, mean you have IDS, so do a READ not a BROWSE.