Difference Between browse() and search()  in Odoo?

✅ Purpose of Each

Method
Purpose
browse() Fetch records by known IDs without querying the database immediately.
search() Find records based on domain filters, performs a real database query.

 📌 Realistic Odoo Examples

1. browse() – When you already know the record ID(s)
product = self.env[‘product.product’].browse(25)
  • Fetches product with ID 25.
  • If record with ID 25 does not exist, it returns an empty recordset (not error).
  • No SQL query is executed until the record is actually accessed (lazy loading).
🧪 Example in Context:

def get_product_name(self, product_id):

    product = self.env[‘product.product’].browse(product_id)

    return product.name if product.exists() else ‘Unknown’

2. search() – When you need to find records based on criteria
products = self.env[‘product.product’].search([(‘type’, ‘=’, ‘product’)])
  • Returns all products with type = ‘product’.
  • Performs actual SQL query immediately.
  • Returns an empty recordset if no records match.

🧪 Example in Context:

def get_all_storable_products(self):

    products = self.env[‘product.product’].search([(‘type’, ‘=’, ‘product’)])

    return products

🧠 Key Differences

Feature
browse()
search()
Input Record ID(s) only Domain (list of filter conditions)
Query Execution Lazy (on access) Immediate database query
Returns Recordset (even if empty) Recordset (even if empty)
Typical Use Case Access known records (e.g., from foreign keys, ID) Search using conditions or filters
Error on Non-existent ID No, returns empty recordset No error; just returns empty result

✅ Summary Table

Method Used For Performs DB Query? Accepts Domain? Accepts IDs?
browse() Accessing known records ❌ (Lazy access)
search() Finding records by criteria ✅ (Immediate)